为什么在Python3中str(float)返回的数字比Python2多?

2024-09-30 10:26:44 发布

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

在Python2.7中,floatrepr返回最接近的十进制数,最长可达17位;这足够精确,可以唯一标识每个可能的IEEE浮点值^一个float的{}工作原理类似,只是它将结果限制为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

是否有描述变更的政治公众人物或负责人的其他声明


Tags: comhttp二进制情况差异float标识浮点
1条回答
网友
1楼 · 发布于 2024-09-30 10:26:44

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

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

除了简单之外,还有一些不太明显的好处。过去reprstr的区别让用户感到困惑的一个方面是repr自动在容器中使用。例如,在Python 2.7中:

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

我敢肯定至少有一个StackOverflow问题在问这个现象:here is one suchanother最近的一个。通过Python 3.2中引入的简化,我们得到了以下结果:

>>> x = 1.4 * 1.5
>>> print(x)
2.0999999999999996
>>> print([x])
[2.0999999999999996]

这至少更加一致

如果您确实希望能够隐藏不精确的内容,那么正确的方法仍然是:使用字符串格式精确控制输出格式

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

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

相关问题 更多 >

    热门问题