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