比较浮动结果时,为什么循环没有开始?

时间:2019-04-30 17:40:17

标签: python python-3.x

目标是当sleep_time达到0.1时,它会开始循环并打印数字。

import time

number = 0
sleep_time = 1

# Main code
while sleep_time >= 0.1:
    if sleep_time == 0.1:
        while True:
            print(number)
    number += 1
    time.sleep(sleep_time)
    print(number)
    sleep_time -= 0.1

这会打印从1到10的数字,然后停止。

2 个答案:

答案 0 :(得分:4)

这是浮点不精确的问题,请考虑:

>>> sleep = 1
>>> dec = 0.1
>>> for _ in range(9):
...     sleep -= dec
...
>>> sleep
0.10000000000000014
>>> sleep == 0.1
False
>>>

在处理这类事情时,通常math.isclose是可行的解决方案:

>>> import math
>>> math.isclose(sleep, 0.1)
True
>>>

以下应为required reading

其他方法是仅使用int对象或使用decimal.Decimal

答案 1 :(得分:1)

这是由于floating point error造成的。

x = 1.0
for _ in range(9):
    x -= 0.1

print(x) # 0.10000000000000014
print(x == 0.1) # False

当处理原子量的问题需要精确的算术时,最好使用int而不是float。在这种情况下,您的原子量为十分之一秒,我们将1表示为0.1秒。

import time

number = 0
sleep_time = 10 # in tenth of seconds

# Main code
while sleep_time >= 1:
    if sleep_time == 1:
        while True:
            print(number)
    number += 1
    time.sleep(sleep_time / 10)
    print(number)
    sleep_time -= 1