我无法弄清楚为什么我的计时器在运行时没有达到零。当a = 0时,我试图让窗口关闭但是为什么请保持减少到负数?这是我的代码
def close_timer(self):
global a
a = float(a - 0.1)
self.labeltext.set(str(("%.1f" % (a))))
a = float(a)
print a
print (a == 0)
if a == 0:
self.canvas.after(100)
self.root.destroy()
self.root.after(100,self.close_timer)
答案 0 :(得分:3)
浮点数数学is generally inaccurate - 您无法准确表示二进制浮点中的小数0.1
,因此您永远不会达到0
:
>>> a = 1
>>> while a > 0:
... a = a - 0.1
... print(repr(a))
...
0.9
0.8
0.7000000000000001
0.6000000000000001
0.5000000000000001
0.40000000000000013
0.30000000000000016
0.20000000000000015
0.10000000000000014
1.3877787807814457e-16
-0.09999999999999987
使用if abs(a) < 0.000001:
或类似内容。
答案 1 :(得分:1)
将浮点数与固定值进行比较总是很危险的,除非您了解并减轻后果。
最有可能的是,你的价值正在下降到:
0.099999923354
每次减去0.1
(在IEEE754中无法直接表示)时,不精确度会逐渐注入您的值。
然后,当你减去最后的0.1
时,你会得到类似的东西:
-0.00000005345
不等于零。
最快的解决方法是将零检查更改为:
if a <= 0:
所以小错误是无关紧要的,除了可能需要一个额外的周期(可能是十分之一秒),如果它达到0.0000001
它应该为零,例如。
如果你想确保你没有采取额外的周期,并且你确信逐渐引入的错误不会太大,只需将其更改为:
if a <= 0.0003:
或类似的东西。