python - 为什么 str(float) 在 Python 3 中返回的位数比 Python 2 多?

标签 python python-2.7 python-3.x floating-point-conversion

在 Python 2.7 中,floatrepr 返回最接近的十进制数,最长为 17 位;这足以精确地识别每个可能的 IEEE 浮点值。 floatstr 的工作方式类似,只是它将结果限制为 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 中,strrepr 似乎返回相同的内容。

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,按照上面链接的讨论,strrepr制作相同。至于为什么:它使语言更小更干净,并且在输出字符串时消除了相当随意的 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/

相关文章:

Python:列表不对角搜索

python - 由于某种原因无法从 p 标签获取文本 - Selenium (Python)

python - pip使用Python 2.5并且需要使用Python 2.7

android - 使用 adb shell 获取 Android 目录中的文件数

python - 从名称中带点的文件夹导入 - Python

python - 使用 fileConfig 在 Python 中配置自定义处理程序

python - 使用 Pygments 检测代码片段的编程语言

python - wxPython 属性错误 : module has no attribute 'Frame'

Python 模块名称错误

python - 在 pandas 中使用下采样的另一种方法