基本的Python数字!

时间:2009-12-12 11:20:41

标签: python floating-point core

为什么0.1 + 0.1 + 0.1 - 0.3会评估 Python中的5.5511151231257827e-17

6 个答案:

答案 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。