1

使用列表推导表达式时:

[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]

这背后的原因是什么?

4

3 回答 3

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/(一般使用浮动的基本教程)

于 2013-05-14T19:20:39.783 回答
2

列表理解无关紧要。

>>> 3 * 0.1
0.30000000000000004
>>> 2 * 0.1
0.2
>>> 0.1 + 0.2
0.30000000000000004

有关 Python 浮点数和浮点运算的更多信息 -此处

于 2013-05-14T19:23:39.937 回答
1

列表理解无关紧要,这纯粹是浮点数的问题。要获得非常详细的答案,您应该阅读这篇文章:http: //docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2013-05-14T19:27:10.933 回答