为什么str(float)在python3中返回的位数多于python2?

2024-06-02 07:16:30 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python2.7中,floatrepr返回最接近的十进制数,最长可达17位;这个精度足以唯一地标识每个可能的IEEE浮点值。^一个float的{}工作原理类似,只是它将结果限制在12位;对于大多数情况来说,这是一个更合理的结果,并且使您不受二进制和十进制表示之间的细微差别的影响。在

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}$

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


Tags: comhttp二进制情况精度float标识浮点
1条回答
网友
1楼 · 发布于 2024-06-02 07:16:30

不,没有政治公众人物。bug tracker中有一个issue,Python开发人员邮件列表中有一个associated discussion。虽然我负责提议和实施变更,但我不能说这是我的想法:它是在europython2010与Guido的对话中产生的。在

一些更详细的信息:正如在评论中已经提到的,Python3.1为浮点的字符串repr引入了一种新算法(后来被后传到Python2系列,因此它也出现在Python2.7中)。这种新算法的结果是,在提示符处键入的“短”十进制数具有相应的简短表示。这消除了str和{}之间差异的一个现有原因,并使{}和{}使用相同的算法成为可能。因此,对于python3.2,按照上面链接的讨论,str和{}是相同的。至于原因:它使语言变得更小、更干净,并且在输出字符串时去掉了12位数字的任意选择。(在2.7之前的Python版本中,repr所使用的17位数字的选择远非随意,顺便说一句:两个不同的IEEE 754 binary64 float在转换为具有17个有效数字的十进制数时将有不同的表示,17是具有此属性的最小整数。)

除了简单,还有一些不太明显的好处。在过去,repr与{}的区别之一是,repr会自动在容器中使用。例如,在Python 2.7中:

>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]

我确信在某个地方至少有一个StackOverflow问题在问这个现象:here is one such,还有{a4}最近的一个。通过Python 3.2中引入的简化,我们得到了以下结果:

^{pr2}$

至少更加一致。在

如果您确实希望能够隐藏不精确性,正确的方法仍然是相同的:使用字符串格式来精确控制输出格式。在

>>> print("{:.12g}".format(x))
2.1

我希望这能解释这一变化背后的一些原因。我不想说它是普遍有益的:正如你所指出的,旧的str有隐藏不精确的方便的副作用。但在我看来(当然,我有偏见),它确实有助于消除语言中的一些意外。在

相关问题 更多 >