首页 > 解决方案 > 为什么我在 python 中使用 while lopp 在每个步骤中添加 0.050 时得到 x=0.15000000000000002

问题描述

我运行下面的python代码,

x=0
while x<1:
    x+=0.050
    print(x)

并得到以下结果。我不明白。

0.05 0.1 0.15000000000000002 0.2 0.25 0.3 0.35 0.39999999999999997 0.44999999999999996 0.49999999999999994 0.5499999999999999 0.6 0.65 0.7000000000000001 0.7500000000000001 0.8000000000000002 0.8500000000000002 0.9000000000000002 0.9500000000000003 1.0000000000000002

标签: python-3.x

解决方案


您正在进行浮点计算,我认为这是您第一次看到浮点错误。此错误不取决于 Python,而是取决于计算机中实数的底层实现:不幸的是,许多实数无法在机器内部完美表示,因为内存只能处理有限数量的数字,因此它会截断数字,有效地犯了错误。

“但 0.05 没有无限位数”,你会说。如果计算机以 10 为基数工作,这将是正确的,但它们使用以 2 为基数的二进制数,因此以 10 为基数的有限位表示可能具有二进制的周期性表示。

为了您的程序,您不妨降低打印数字的精度,因为在您的问题范围内错误不会很明显(错误不会累积那么多),这样:

print("{.3f}".format(x))

我建议在 Google 上查找并访问其他评论中的链接,这是一个非常有趣的话题。

因为你在做这种计算时会出错,所以float在做重要的事情时绝对避免使用类型,比如货币可控制性!您应该改用任意精度类型,例如Decimal


推荐阅读