Discuss / Python / 第三题作业,另外有一个关于小数的疑问,貌似是BUG。

第三题作业,另外有一个关于小数的疑问,貌似是BUG。

Topic source

与非----

#1 Created at ... [Delete] [Delete and Lock User]

答题过程中发现了一个BUG ,如下:


123456*0.00001   # 输出:  1.23456
123456*0.0001    # 输出:  12.345600000000001
123456*0.001     # 输出:  123.456
123456*0.01      # 输出: 1234.56

123456*0.0001*10000    #输出  123456.00000000001
123456*(0.0001*10000)  #输出  123456.0

做这个题的时候本来是想用乘法的,但发现乘了之后结果有错误。 我把这个发到了群里,他们测试的结果也是这样。但有一个用2.7版本的结果是正常的。看来这是3.4的一个BUG。

---------------- 以下是作业 ----------------------

想了很久,不知道该怎么写。看到别人交的作业都用到了find之类的方法,但由于这些方法之前的课程中并没有讲到。所以我就默认老师是让我们用现学的知识来答题。

我的作业代码虽然多一些,但都是根据之前课程中所提到的知识写的。

因为最后用到了除法(本来想用乘法的,但乘法有BUG),所以如果小数点太多的话,会被四舍五入。


from functools import reduce
def str2float(s):

#用for循环得出小数点的位置,并用len获取小数点后面的位数。
    n = 0
    for x in s :
        if x == ".":
            ls = len(s[n+1:])
        n = n + 1 

#---创建函数power 用来获取任意数的任意次方
    def power(x,n):        
        s=1
        while n>0 :
            n=n-1
            s=s*x
        return s

    def myints(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9 ,".":"."}[s]
    def xy (x,y):
        if y == ".":
            return x
        return x*10+y
    return reduce(xy,map(myints,s)) / power(10,ls)   #结果除以10的ls次方(ls是小数点后面的位数)
print('str2float(\'123.456\') =', str2float('1.23456'))
i = input("\n输入任意小数:\n")
print(str2float(i))

与非----

#2 Created at ... [Delete] [Delete and Lock User]

-------关于上面提到的小数问题-------------

看了知乎上的一些回答之后,大概明白了一些。 自己又测试了一下,发现只要出现 5 和 6 ,结果就很容易出错。 但如果没有5 或 6 ,结果就基本是正常的。

http://www.zhihu.com/question/25457573


  • 1

Reply