为什么0.1 + 0.1 + 0.1 - 0.3
会评估
Python中的5.5511151231257827e-17
?
答案 0 :(得分:15)
因为这是浮点数的工作原理。如果您需要精确的数字,请使用decimal
模块。如果要使用浮点数,则必须记住在显示它们时将它们舍入为特定的精度。
>>> print '%.2f' % (0.1+0.1+0.1-0.3,)
0.00
答案 1 :(得分:7)
这通常是浮点数的问题。有关说明,请参阅维基百科上的this section。粗略地说 - 存在舍入错误。请注意,您给我们的数字非常小 - 约为0.00000000000000005551115123。以下是关于该主题的a more technical paper。
答案 2 :(得分:4)
答案 3 :(得分:3)
您可能有兴趣知道Python 3通过更改repr
的工作方式改善了这种情况。它现在将为您提供最短的字符串表示形式,将其转换回原始浮点数:
Python 3.1.1+ (r311:74480, Oct 11 2009, 20:19:13) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 '0.1'
旧版本的行为如下:
Python 2.6.4 (r264:75706, Oct 28 2009, 22:19:17) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 '0.10000000000000001'
只有repr
的输出(在交互式解释器中输入值时隐式调用)已更改。基础值仍然是IEEE-754浮点数,它们仍然具有通常的限制:
Python 3.1.1+ (r311:74480, Oct 11 2009, 20:19:13) [GCC 4.3.4] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 0.1 0.1 >>> 0.2 0.2 >>> 0.3 0.3 >>> 0.1 + 0.2 0.30000000000000004 >>> 0.1 + 0.2 - 0.3 5.551115123125783e-17
答案 4 :(得分:2)
由于浮点数在计算机中的表示方式。它不仅仅是Python的东西。
答案 5 :(得分:0)
作为一个例子,考虑将1/3表示为基数10中的科学数字。只有有限数量的数字(比如10),你最终会出现舍入误差。比如说1/3≈0.3333333333e0。然后,1/3 + 1/3 + 1/3(在首次转换为十进制扩展之后)表示为0.9999999999e0,但是1是1.0e0。类似地,1 /7≈0.1428571429e0,1/ 7 + 1/7将是0.2857142858e0,但2/7的表示将是0.2857142857e0。在这两种情况下,总和都是1e-10。