在 Python 2.7 中,float
的 repr
返回最接近的十进制数,最长为 17 位;这足以精确地识别每个可能的 IEEE 浮点值。 float
的 str
的工作方式类似,只是它将结果限制为 12 位;在大多数情况下,这是一个更合理的结果,并使您免受二进制和十进制表示之间的细微差别。
Python 2 演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
在 Python 3.2 中,str
和 repr
似乎返回相同的内容。
Python 3 演示:http://ideone.com/oAKRsb
print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
是否有描述变更的 PEP 或来自负责人的其他声明?
最佳答案
不,没有 PEP。有一个issue在错误跟踪器中,以及 associated discussion在 Python 开发者邮件列表中。虽然我负责提出和实现更改,但我不能说这是我的想法:它是在 EuroPython 2010 上与 Guido 的对话中提出的。
更多细节:正如评论中已经提到的,Python 3.1 为字符串 repr
引入了一种新算法。 float ,(后来向后移植到 Python 2 系列,因此它也出现在 Python 2.7 中)。作为这种新算法的结果,在提示符处键入的“短”十进制数字具有相应的短表示。这消除了 str
之间存在差异的现有原因之一。和 repr
, 并且可以对 str
使用相同的算法和 repr
.所以对于 Python 3.2,按照上面链接的讨论,str
和 repr
制作相同。至于为什么:它使语言更小更干净,并且在输出字符串时消除了相当随意的 12 位选择。 (顺便说一下,在 2.7 之前的 Python 版本中,repr
使用的 17 位数字的选择远非任意:两个不同的 IEEE 754 binary64 float 在转换为具有 17 个有效数字的十进制时将具有不同的表示,而 17 是具有此属性的最小整数。)
除了简单之外,还有一些不太明显的好处。 repr
的一方面与 str
相比过去让用户感到困惑的区别是 repr
自动在容器中使用。例如在 Python 2.7 中:
>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]
我确信至少有一个 StackOverflow 问题在某处询问此现象:here is one such , 和 another最近的一个。通过 Python 3.2 中引入的简化,我们得到了这个:
>>> x = 1.4 * 1.5
>>> print(x)
2.0999999999999996
>>> print([x])
[2.0999999999999996]
这至少更一致。
如果您确实希望能够隐藏不精确性,正确的方法保持不变:使用字符串格式来精确控制输出格式。
>>> print("{:.12g}".format(x))
2.1
我希望这能解释这种变化背后的一些原因。我不会争辩说它是普遍有益的:正如您所指出的,旧的 str
具有隐藏不精确性的方便副作用。但在我看来(当然,我有偏见),它确实有助于消除语言中的一些惊喜。
关于python - 为什么 str(float) 在 Python 3 中返回的位数比 Python 2 多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25898733/