Python Float舍入错误

Python Float rounding errors

本问题已经有最佳答案,请猛点这里访问。

使用列表理解表达式时:

1
[x * 0.1 for x in range(0, 5)]

我希望得到这样的清单:

1
[0.0, 0.1, 0.2, 0.3, 0.4]

但是我得到的是:

1
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]

这背后的原因是什么?


在几乎每种语言中,浮点数本质上都是不精确的。

如果需要精确的精度,请使用decimal类

1
2
from decimal import Decimal
print Decimal("0.3")

如果你只需要它们看起来很漂亮,只需在显示时使用格式字符串如:

1
"%0.2f"%2.030000000000034

如果要比较它们,请使用一些阈值

1
if num1 - num2 < 1e-3 : print"Equal Enough For Me!"

**见Abarnett关于阈值的评论…这是一个非常简单的例子,更深入地解释了epsilon阈值,我在这里找到了一篇文章http://www.cygnus-software.com/papers/comparingfloats/comparising%20floating%20point%20numbers.htm

附加阅读:

http://docs.oracle.com/cd/e19957-01/806-3568/ncg_goldberg.html(详细说明)

http://floating-point-gui.de/basic/(一般使用float的基本教程)


清单理解并不重要。

1
2
3
4
5
6
>>> 3 * 0.1
0.30000000000000004
>>> 2 * 0.1
0.2
>>> 0.1 + 0.2
0.30000000000000004

关于python浮点运算和浮点运算的更多信息-这里


列表理解是不相关的,这纯粹是浮点数字的问题。对于一个非常详细的答案,您应该阅读本文:http://docs.oracle.com/cd/e19957-01/806-3568/ncg_goldberg.html