【发布时间】:2014-09-17 19:25:05
【问题描述】:
在 Python 2.7 中,float 中的 repr 返回最接近的十进制数,最长为 17 位;这足以精确地识别每个可能的 IEEE 浮点值。 str 的 float 的工作方式类似,只是它将结果限制为 12 位;在大多数情况下,这是一个更合理的结果,并使您免受二进制和十进制表示之间的细微差别。
Python 2 演示:http://ideone.com/OKJtxv
print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
在 Python 3.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
是否有描述变更的 PEP 或来自负责人的其他声明?
【问题讨论】:
-
看起来问题#1580 可能与此处相关。 What’s New In Python 3.1: Other Language Changes(最后一个要点)中也有关于此更改的注释。
-
Python 3.1 添加了一项新功能,通过舍入到浮点数的一个 epsilon 内的 最短 小数而不是 最接近的,来隐藏不相关的舍入错误>,因此不再需要 12 位破解。
-
@abarnert 我认为我的简短示例显示了这种想法的谬误。您提供的链接似乎只与将要中断的测试有关,而不是首先是否是一个好主意;也许邮件列表讨论更有理由。
-
@MarkRansom:嗯,在这种特殊情况下,12 位数的破解是错误的,正如您在
2.0999999999999996 == 2.1中看到的那样。当然,有时您可能想要这种不精确性,即使它不是无关紧要的,但有时您也只想要 2 位数字,当然 Python 提供了明确且轻松地做到这一点的方法,它只是没有隐式地做到这一点。无论如何,如果您想争论基本原理或尝试更改 Python,这不是这样做的地方。无论 Lukas 和 georg(不是我)发布的问题中的论点是否谬误,它们都是论点。
标签: python python-2.7 python-3.x floating-point-conversion