为什么我的if语句显示为假?当a == 0时,代码不会退出。时间应该是以分钟/秒为单位

时间:2012-11-03 06:57:36

标签: python python-2.7 tkinter

我无法弄清楚为什么我的计时器在运行时没有达到零。当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)

2 个答案:

答案 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:

或类似的东西。