Python中的浮点平等处理

时间:2013-04-19 15:29:51

标签: python floating-point

我对Python比较陌生,通过文档网站上的tutorial page阅读,我看到了这个片段:enter image description here 这让我很好奇,所以我决定把它输入一个Python文件并进行测试。然而,当我这样做时,它给了我不同的结果:

   .1+.1+.1 == .3
=> True

这个问题可能看似微不足道,但我很好奇为什么实际行为与Python文档所说的不符。有什么答案吗?

使用online interpreter时出现此问题。在本地运行它返回False。

2 个答案:

答案 0 :(得分:2)

你从未说过你正在运行哪个版本的Python,这会产生巨大的差异。该算法很可能是基于IEEE的双精度数,从系统到系统应该是一致的。但是,CPython基于底层的C库,并且它们在输入时对浮点常量进行舍入的方式可能不同。其他版本的Python也将依赖于某些底层平台。

修改:确认。使用问题中给出的在线翻译我得到:

   '%0.20f' % (.1+.1+.1,)
=> '0.30000000000000004441'
   '%0.20f' % (.3,)
=> '0.30000000000000004441'

在Windows上使用Python 2.7:

>>> '%0.20f' % (.1+.1+.1,)
'0.30000000000000004441'
>>> '%0.20f' % (.3,)
'0.29999999999999998890'

在线翻译似乎以不同方式对输入进行舍入。

答案 1 :(得分:1)

第一个评论就是答案。在我的系统上:

Python 2.7.3 (default, Sep 26 2012, 21:53:58) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1+0.1+0.1 == 0.3
False
>>>

来自python docs(http://docs.python.org/2/tutorial/floatingpoint.html):

  

二进制浮点运算有许多这样的惊喜。该   下面将详细解释“0.1”的问题   “Representation Error”部分。有关,请参阅The Perils of Floating Point   更完整地说明其他常见的惊喜。