在Python2.7中,float
的repr
返回最接近的十进制数,最长可达17位;这个精度足以唯一地标识每个可能的IEEE浮点值。^一个float
的{
Python2演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
在Python3.2中,str
和{
Python3演示:http://ideone.com/oAKRsb
^{pr2}$是否有一份政治公众人物描述了这一变化,或是某位负责人的其他声明?在
不,没有政治公众人物。bug tracker中有一个issue,Python开发人员邮件列表中有一个associated discussion。虽然我负责提议和实施变更,但我不能说这是我的想法:它是在europython2010与Guido的对话中产生的。在
一些更详细的信息:正如在评论中已经提到的,Python3.1为浮点的字符串}之间差异的一个现有原因,并使{}和{}使用相同的算法成为可能。因此,对于python3.2,按照上面链接的讨论,}是相同的。至于原因:它使语言变得更小、更干净,并且在输出字符串时去掉了12位数字的任意选择。(在2.7之前的Python版本中,
repr
引入了一种新算法(后来被后传到Python2系列,因此它也出现在Python2.7中)。这种新算法的结果是,在提示符处键入的“短”十进制数具有相应的简短表示。这消除了str
和{str
和{repr
所使用的17位数字的选择远非随意,顺便说一句:两个不同的IEEE 754 binary64 float在转换为具有17个有效数字的十进制数时将有不同的表示,17是具有此属性的最小整数。)除了简单,还有一些不太明显的好处。在过去,}的区别之一是,
repr
与{repr
会自动在容器中使用。例如,在Python 2.7中:我确信在某个地方至少有一个StackOverflow问题在问这个现象:here is one such,还有{a4}最近的一个。通过Python 3.2中引入的简化,我们得到了以下结果:
^{pr2}$至少更加一致。在
如果您确实希望能够隐藏不精确性,正确的方法仍然是相同的:使用字符串格式来精确控制输出格式。在
我希望这能解释这一变化背后的一些原因。我不想说它是普遍有益的:正如你所指出的,旧的
str
有隐藏不精确的方便的副作用。但在我看来(当然,我有偏见),它确实有助于消除语言中的一些意外。在相关问题 更多 >
编程相关推荐