这必须是一种经常旅行的陷阱。定义以下函数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
这不是解决方案......除非完全是。那么...... 是吗?如果没有,这里的诀窍是什么?
答案 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
设置为x
和0.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