我对这种减法和求和如何以这种方式工作有点困惑:
A = 5
B = 0.1
C = A+B-A
我发现答案是0.099999999999999645。为什么答案不是0.1?
答案 0 :(得分:3)
这是一个浮点舍入错误。 Python网站有一个非常好的tutorial on floating point numbers,它解释了这是什么以及它发生的原因。
如果您想要一个确切的结果,您可以:
格式化结果以显示设定的小数位数(这不能解决舍入错误):
print "%.2f"%C
我还建议阅读Brian的答案,阅读“每个计算机科学家应该知道的关于浮点算术的内容”。
答案 1 :(得分:2)
为什么答案不是0.1?
浮点数不够精确,无法得到答案。但是,圣牛是否已经接近了!
我建议您阅读" What Every Computer Scientist Should Know About Floating-Point Arithmetic"
答案 2 :(得分:2)
您正在看到浮点运算的假象,它没有无限精度。有关FP数学如何工作的完整描述以及为什么会出现舍入错误,请参阅this article。
答案 3 :(得分:2)
这是因为所谓的epsilon值。这意味着从x
到x+E
,每个浮点数都被视为等于x
。
您可以在this Q&A中阅读有关此值的内容
在python中,这个epsilon值(E
)取决于数字的magnitune,你可以随时从numpy.spacing(x)
得到它
答案 4 :(得分:2)
计算机使用“二进制数”来存储信息。整数可以准确存储,但小数通常存储为“浮点数”。
有些数字很容易在base-10中写入,无法用二进制浮点格式精确表示,0.1是其中一个数字。
可以准确存储数字,并准确处理数字。例如,数字0.1可以存储为1 / 10
,换句话说,存储为分子(1)和分母(10),理解分子除以分母。然后一个正确编写的数学库可以使用这些分数并为您做数学运算。但它比使用浮点数慢得多,所以它并不经常使用。 (我认为在银行业中,他们通常只使用整数而不是浮点来存储货币; 1.23美元可以存储为数字123,隐含两位小数。当处理货币时,浮点数不够准确! )