1

我试图通过在 python 中将其增加 0.001 来获得从零开始的一系列数字。直到 0.008 为止,它都给出了正确的结果。在下一次迭代中,该值必须恰好是 0.009,但输出给出 0.009000000000000001。这种错误也可以在进一步的迭代中看到。以下代码:

t = 0.000
dt = 0.001
timemax = 0.012
while(t<timemax):
    print(t)
    t = t + dt
    if(t>= timemax):
        exit()

输出如下:

0.0
0.001
0.002
0.003
0.004
0.005
0.006
0.007
0.008
0.009000000000000001
0.010000000000000002
0.011000000000000003

dt = 0.01当 和 的值时甚至可以看到错误timemax = 0.12。它的代码如下:

t = 0.000
dt = 0.01
timemax = 0.12
while(t<timemax):
    print(t)
    t = t + dt
    if(t>= timemax):
        exit()

输出:

0.0
0.01
0.02
0.03
0.04
0.05
0.060000000000000005
0.07
0.08
0.09
0.09999999999999999
0.10999999999999999
0.11999999999999998

为什么会这样?我们可以采取什么措施来解决这个问题?

4

2 回答 2

0

这是计算机中如何表示实数的结果(谷歌浮点运算)。

错误很少重要。如果确实如此,请考虑适当舍入。

或者,改用整数,如下所示:

t = 0
dt = 10 # ms
timemax = 120
while(t<timemax):
    print(t)
    t = t + dt
    if(t>= timemax):
        print(f"{t/1000} seconds")
        exit()

如果您实际上不是对连续的值进行建模,而是对离散的不同值进行建模,那么最后一种方法通常更可取。

于 2021-09-29T18:49:28.093 回答
0

Python 的float对象使用 64 位,因此它只能表示有限数量的数字。因此,您会看到这些与“真实”数学所期望的小偏差。有关更多信息,请参阅此问题

如果您需要精确地表示十进制值,decimal标准库中有模块。

还有一个mpmath项目,它允许任意精度的浮点运算。

于 2021-09-29T19:15:58.637 回答