1

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

2 回答 2

3

浮点数数学通常是不准确的 - 你不能准确地表示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:或类似的东西。

于 2012-11-03T07:11:33.353 回答
1

除非您知道并减轻后果,否则将浮点数与固定值进行比较总是很危险的。

最有可能的是,您的价值正在下降为:

0.099999923354

因为每次减去时都会逐渐将不精确性注入到您的值中0.1(这在 IEEE754 中无法直接表示)。

然后,当你减去 final 时0.1,你会得到类似:

-0.00000005345

等于零

最快的解决方法是可能将您的零检查更改为:

if a <= 0:

所以小错误是无关紧要的,除了可能需要一个额外的周期(可能是十分之一秒),如果它到达0.0000001它应该为零的地方,例如。

如果您想确保不采取额外的循环,并且您确信逐渐引入的错误不会太大,只需将其更改为:

if a <= 0.0003:

或类似的东西。

于 2012-11-03T07:12:01.387 回答