Python中的浮点相等处理

Python中的浮点相等处理,python,floating-point,Python,Floating Point,我对Python比较陌生,通过阅读文档网站上的一篇文章,我发现了以下片段: 这让我很好奇,所以我决定将其键入Python文件并进行测试。然而,当我这样做时,它给了我一个不同的结果: .1+.1+.1 == .3 => True 这个问题可能看起来微不足道,但我很好奇,为什么实际的行为与Python文档所说的不匹配。有答案吗 使用时发生此行为。在本地运行它返回False。第一条注释就是答案。在我的系统上: Python 2.7.3 (default, Sep 26 2012, 21:

我对Python比较陌生,通过阅读文档网站上的一篇文章,我发现了以下片段: 这让我很好奇,所以我决定将其键入Python文件并进行测试。然而,当我这样做时,它给了我一个不同的结果:

   .1+.1+.1 == .3
=> True
这个问题可能看起来微不足道,但我很好奇,为什么实际的行为与Python文档所说的不匹配。有答案吗


使用时发生此行为。在本地运行它返回False。

第一条注释就是答案。在我的系统上:

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文档():

二进制浮点运算有很多这样的惊喜。这个 “0.1”的问题在下面的 节。看一看 对其他常见意外事件的更完整描述


您从未说过您正在运行哪一版本的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'

似乎在线口译员对输入进行了不同的轮换。

此处的关键字可能不是。这取决于平台的浮点实现。不,不应该。代码永远不会孤立地运行,输出的内容取决于您输入的内容,在Windows上运行代码可能会与在Unix系统上运行相同的代码产生不同的结果,等等。这是一个很好的起点,有助于了解在幕后会发生什么,也不会发生什么。@LeeDanielCrocker,尽管这很诱人,在某些情况下,浮点比较确实有效,例如,当您想知道某个值是否与以前保存的某个值发生了更改时。这是另一个问题,似乎是无数“我不获取浮点”问题的重复,但实际上有一个转折点。首先,OP至少已经完成了基本的读取,甚至预期会出现浮点问题。第二,事实证明他的环境确实有问题,而不是对浮动本身的误解。所以在我看来,这并不是一个真正的复制品。然而,为了摆脱这个问题的红字,是否值得重新探讨这个问题?我不确定,谢谢。您知道哪些因素会导致代码在一台计算机上返回True,在另一台计算机上返回False?这有什么关系?实际上,您无法对这种不一致性做任何处理,无论如何,正确的编程实践是以一种不关心这样的结果的方式编写代码。@jarednielsen在中的文章中添加了链接answer@KarlKnechtel,我认为,无论最佳实践是什么,都应该质疑为什么您的结果应该偏离官方文档。我运行的是Python 3.3——Python 3处理浮点数的方式与Python 2不同吗?@jarednielsen,我不这么认为,但这是很好的信息,谢谢。从2.7版和更高版本开始,CPython有自己的字符串到浮点和浮点到字符串转换代码;平台不应该有什么不同。。。。事实证明,问题出在平台上。我收回最后的评论。道歉。