在Python2.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

在Python3.2中,strrepr返回相同的内容.

Python 3演示版:http://ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996

是否有一份政治公众人物描述了这一变化,或是负责人的其他声明?

推荐答案

不,没有打气.bug追踪器中有issue个,Python开发者邮件列表中有associated discussion个.虽然我负责提出并实施这一改变,但我不能说这是我的 idea :它是在2010年欧罗皮顿与Guido的对话中产生的.

更多细节:如 comments 中所述,Python3.1为浮点字符串repr引入了一种新算法(后来被后传到Python2系列,因此它也出现在Python2.7中).这种新算法的结果是,在提示符处输入的"短"十进制数具有相应的短表示形式.这消除了strrepr之间存在差异的现有原因之一,并使strrepr都可以使用相同的算法.因此,对于Python3.2,在上面的讨论之后,strrepr是相同的.至于原因:它使语言变得更小、更简洁,并且在输出字符串时删除了12位数字的任意 Select .(顺便说一句,在2.7之前的Python版本中, Select 用于repr的17位远不是任意的:两个不同的IEEE 754 binary64浮点在转换为具有17个有效位的十进制时将具有不同的表示,17是具有此属性的最小整数.)

除了简单,还有一些不太明显的好处.过go ,reprstr的区别让用户感到困惑的一个方面是,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-3.x相关问答推荐

安装grpcio时出现错误DeproationWarning:pkg_resource

Select 作为 MultiIndex 一部分的两个 DatetimeIndex 之间的行

继承自 Counter 与 dict 的类实例的 Deepcopy

生成具有偶数个 0 和 1 的给定长度的所有二进制数

移动所有列的数据帧值以使其单调递增

使用 Python 截断并重新编号对应于特定 ID/组的列

提高时间复杂度的一些建议

如何计算Pandas 列中每列唯一项目的出现次数?

Python ** 用于负数

python3:字节与字节数组,并转换为字符串和从字符串转换

使用 distutils 分发预编译的 python 扩展模块

为什么 Django South 1.0 使用 iteritems()?

cv2 python 没有 imread 成员

登录csv文件的正确方法是什么?

使用 python2 和 python3 创建一个 virtualenv

导入父目录进行简要测试

对字节进行按位运算

为什么在 Python 3 中实例的 __dict__ 的大小要小得多?

map 对象不是 JSON 可序列化的

如何在 Python 3.2 中退出?