Python .1 - .1 =极小数/负指数?

时间:2014-01-28 05:37:50

标签: math python-2.7

这必须是一种经常旅行的陷阱。定义以下函数foo()

>>> def foo():
...     x = 1
...     while x != 0:
...             x -= .1
...             if x < 0:
...                     x = 0
...             print x

当然,当我们调用函数时,我们得到了我们期望获得的函数。

>>> foo()
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1
1.38777878078e-16    # O_o
0

所以,我知道整数与浮点数的数学可能会有点奇怪。只需输入3 - 2.9就可以得到这样的答案:

>>> 3 - 2.9
0.10000000000000009

所以,公平地说 - 这并没有引起我正在讨论的剧本中的问题。但肯定会悄悄地抓住那些实际上会受到价值影响的人,因为天文数字很小,只有1.38777878078e-16。并且为了防止由于奇怪的小数字而出现问题,我将这个宝石放在我的控制器的底部:

if (x < .1 and x > 0) or x < 0:
    x = 0

这不是解决方案......除非完全。那么...... 吗?如果没有,这里的诀窍是什么?

3 个答案:

答案 0 :(得分:0)

这当然可以“爬行并咬人”,通常当他们试图比较花车时:

>>> a = 1 / 10
>>> b = 0.6 - 0.5
>>> a == b
False

因此,通常使用公差来比较浮点数:

>>> tolerance = 0.000001
>>> abs(a - b) < tolerance
True

答案 1 :(得分:0)

这个程序:

def foo():
    x = 1
    while x != 0:
        x -= .1
        if x < 0:
            x = 0
        print '%.20f' % x
foo()

打印出来:

0.90000000000000002220
0.80000000000000004441
0.70000000000000006661
0.60000000000000008882
0.50000000000000011102
0.40000000000000013323
0.30000000000000015543
0.20000000000000014988
0.10000000000000014433
0.00000000000000013878
0.00000000000000000000

您没有以足够的精度打印数字,以查看实际发生的情况。当您明确将print '%.20f' % x设置为x0.9时,请将其与0.8的输出进行比较,依此类推。您可能需要特别注意0.5的结果。

答案 2 :(得分:-1)

你忽略了这一点 - 这不是你想要的解决方法。只需信任VM,并假设它完成所有计算,就像它们应该完成的那样。

您要做的是格式化您的号码。找出值与其表示之间的差异。

>>> x = 0.9
>>> while x>0.1:
...     x -= 0.1
... 
>>> x
1.3877787807814457e-16
>>> "{:.2f}".format(x)
'0.00'

这里有一个显示2位小数值的例子。有关格式化的更多信息(数字格式也是如此),您会找到HERE