使用列表推导表达式时:
[x * 0.1 for x in range(0, 5)]
我希望得到这样的列表:
[0.0, 0.1, 0.2, 0.3, 0.4]
但是我反而得到了这个:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]
这背后的原因是什么?
使用列表推导表达式时:
[x * 0.1 for x in range(0, 5)]
我希望得到这样的列表:
[0.0, 0.1, 0.2, 0.3, 0.4]
但是我反而得到了这个:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4]
这背后的原因是什么?
几乎所有语言中的浮点数本质上都是不精确的
如果您需要精确的精度,请使用Decimal类
from decimal import Decimal
print Decimal("0.3")
如果您只需要它们看起来很漂亮,只需在显示时使用格式字符串,例如:
"%0.2f"%2.030000000000034
如果您想比较它们,请使用一些阈值
if num1 - num2 < 1e-3 : print "Equal Enough For Me!"
**参见 abarnert 对阈值的评论 ...这是一个非常简化的示例,用于更深入地解释 epsilon 阈值我发现的一篇文章在这里http://www.cygnus-software.com/papers/comparingfloats/Comparing%20floating% 20point%20numbers.htm
补充阅读:
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html(详细解释)
http://floating-point-gui.de/basic/(一般使用浮动的基本教程)
列表理解无关紧要。
>>> 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