在Python2.7中,float
的repr
返回最接近的十进制数,最长可达17位;这足够精确,可以唯一标识每个可能的IEEE浮点值^一个float
的{
Python 2演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
在Python3.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
是否有描述变更的政治公众人物或负责人的其他声明
不,没有打气。bug跟踪器中有一个issue,Python开发人员邮件列表中有一个associated discussion。虽然我负责提出并实施这一改变,但我不能说这是我的想法:它是在2010年欧罗皮顿与Guido的对话中产生的
更多细节:如评论中所述,Python3.1为浮点的字符串
repr
引入了一种新算法(后来后移植到Python2系列,因此它也出现在Python2.7中)。这种新算法的结果是,在提示符处键入的“短”十进制数具有相应的短表示形式。这消除了str
和repr
之间存在差异的现有原因之一,并使str
和repr
可以使用相同的算法。因此,对于Python3.2,在上面链接的讨论之后,str
和repr
是相同的。至于原因:它使语言变得更小更干净,并且在输出字符串时删除了12位数字的任意选择。(顺便说一句,在2.7之前的Python版本中,对repr
使用的17位数字的选择绝非任意:两个不同的IEEE 754 binary64浮点在转换为具有17位有效数字的十进制时将具有不同的表示,17是具有此属性的最小整数。)除了简单之外,还有一些不太明显的好处。过去
repr
与str
的区别让用户感到困惑的一个方面是repr
自动在容器中使用。例如,在Python 2.7中:我敢肯定至少有一个StackOverflow问题在问这个现象:here is one such和another最近的一个。通过Python 3.2中引入的简化,我们得到了以下结果:
这至少更加一致
如果您确实希望能够隐藏不精确的内容,那么正确的方法仍然是:使用字符串格式精确控制输出格式
我希望这能解释改变背后的一些原因。我不想说它是普遍有益的:正如你所指出的,旧的
str
有隐藏不精确的方便的副作用。但在我看来(当然,我是有偏见的),它确实有助于消除语言中的一些惊喜相关问题 更多 >
编程相关推荐