Python中while循环不一致性

5

从未见过这样的东西。一个简单的while循环:

t_end = 100.0
t_step= 0.1
time = 0

while time<=t_end:
    time+=t_step
    print time

最近打印的3个值:

...
99.9
100.0
100.1

看起来对我没问题。

现在,我将t_step更改为0.01:

t_end = 100.0
t_step= 0.01
time = 0

while time<=t_end:
    time+=t_step
    print time

最近打印的3个值:

...
99.98
99.99
100.0

问题:当时间time=t_end=100.0时,为什么不会进入最后的循环?

有哪些替代方案?


许多(实际上大多数)带有小数部分的十进制数字无法在二进制中精确存储。你实际上没有处理 .1base10 和 .01base10 这些数字,因此当你对它们进行算术运算时,不能保证完全准确。 - chucksmash
3个回答

10

因为这个100.0(求和结果)可能比你手动写的100.0大。你不应该将浮点数进行相等性比较...

你应该阅读这篇文章:

计算机科学家应该了解的浮点算术知识

可能的解决方案:

>>> t_end = 100.0
>>> t_step = 0.01
>>> total = int(t_end/t_step)
>>> for x in itertools.accumulate((t_step for i in range(total + 1))):
    print(x)

所以最后一个元素将是: 100.01000000001426


你会如何完成相同的任务? - user1513100
@user1513100 你可以使用for循环并定义所需的步数。 - JBernardo
@user1513100 我为你的问题添加了一个解决方案 - JBernardo

6

浮点数舍入误差。这是我得到的最后三个值:

99.98000000001424
99.99000000001425
100.00000000001425

4

这是由于浮点数计算的不准确性引起的。您依赖于“==”运算符来比较两个浮点数值,这是不可取的。您看到的“100.0”实际上可能是类似于“100.000000000314”的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接