编辑:我知道这个问题已经回答了,我只是没有找到。感谢所有向我指出正确方向的人。
为什么当我运行以下代码时答案不是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语言是如何工作的,是硬件问题还是其他原因?
我似乎在堆栈溢出中找不到与此相关的任何东西,并且真的很想了解发生了什么。
答案 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