谁能在python中解释这个减法和求和?

时间:2013-06-19 04:57:46

标签: python

我对这种减法和求和如何以这种方式工作有点困惑:

A = 5
B = 0.1
C = A+B-A

我发现答案是0.099999999999999645。为什么答案不是0.1?

5 个答案:

答案 0 :(得分:3)

这是一个浮点舍入错误。 Python网站有一个非常好的tutorial on floating point numbers,它解释了这是什么以及它发生的原因。

如果您想要一个确切的结果,您可以:

  • 尝试使用decimal模块
  • 格式化结果以显示设定的小数位数(这不能解决舍入错误):

    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值。这意味着从xx+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,隐含两位小数。当处理货币时,浮点数不够准确! )