Python:为什么.1 + .1 + .1-.3不等于0?

时间:2018-08-01 17:57:52

标签: python math

编辑:我知道这个问题已经回答了,我只是没有找到。感谢所有向我指出正确方向的人。

为什么当我运行以下代码时答案不是0?

a = .1
d = .3

x = - a - a - a + d
y = a + a + a - d

print(f'x is {x}')
print(f'x is {y}')

换句话说-.1-.1-.1 + .3和.1 + .1 + .1-.3

相反,我得到以下信息:

x is -5.551115123125783e-17
y is 5.551115123125783e-17

几乎为零,但不为零。

这是由于python语言是如何工作的,是硬件问题还是其他原因?

我似乎在堆栈溢出中找不到与此相关的任何东西,并且真的很想了解发生了什么。

2 个答案:

答案 0 :(得分:3)

查看这篇文章:David Goldberg - What Every Computer Scientist Should Know About Floating-Point Arithmetic

从本质上讲,这是浮点运算的一个众所周知的问题。您可以使用舍入功能,并舍入到很小的位数以达到实用精度。

round(-5.551115123125783e-17, 10)仍将返回0,这就是您想要的。

答案 1 :(得分:0)

这是由于大多数编程语言存储浮点数的方式所致,其中.1 + .1 + .3等于0.30000000000000004。

与其检查它是否为0,不如检查它们之间的差的绝对值是否小于某个数字:

abs((.1+.1+.3)-.3) < 0.0001