为什么在Python 3中str(float)返回的位数要比Python 2多?

马克·兰索姆(Mark Ransom):

在Python 2.7中,repr的a float返回最接近的十进制数字,最长为17位;这足够精确以唯一地标识每个可能的IEEE浮点值。strfloat工作类似,不同之处在于它限制了结果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中,它出现strrepr返回相同的内容。

Python 3演示:http//ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996

是否有描述变更的PEP或负责人的其他声明?

马克·迪金森(Mark Dickinson):

不,没有PEP。错误跟踪器中有一个问题Python开发人员邮件列表中相关的讨论虽然我负责提出和实施更改,但我不能断言这是我的主意:它是在EuroPython 2010上与Guido进行对话时产生的。

更多详细信息:正如注释中已经提到的那样,Python 3.1引入了一种用于reprfloat 字符串新算法(后来回移植到Python 2系列,因此它也出现在Python 2.7中)。这种新算法的结果是,在提示符下键入的“短”十进制数字具有相应的短表示形式。这消除之间的差额现有的原因之一str,并repr,并有可能使用相同的算法都strrepr因此对于Python 3.2,下面的讨论与上面链接在一起,str并且repr变得相同。至于原因:它使语言更小,更整洁,并且在输出字符串时消除了任意选择的12位数字。(选择的17位数字用于repr 顺便说一句,在2.7之前的Python版本中,并不是很随意:两个不同的IEEE 754 binary64浮点数在转换为带有17个有效数字的十进制时将具有不同的表示形式,而17是具有此属性的最小整数。)

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

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

我敢肯定至少有一个StackOverflow问题在某处询问此现象:这是一个这样的问题另一个是最近的问题。通过Python 3.2中引入的简化,我们得到的是:

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

至少更加一致。

如果您确实希望能够隐藏不精确的地方,那么正确的做法将保持不变:使用字符串格式来精确控制输出格式。

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

我希望这可以解释该更改背后的一些原因。我不会争辩说这是普遍有益的:正如您所指出的那样,旧str有隐藏隐藏错误的便利副作用。但是我认为(当然,我有偏见),它确实有助于消除该语言带来的一些惊喜。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我对 2 位数字的 mod (%) 操作在 python 中返回零

来自分类Dev

为什么 print(2 == 2.) 在 Python 中返回 True

来自分类Python

为什么在Python 2中''> 0 True?

来自分类Dev

为什么在Python中2 **-1025!= 0.0

来自分类Dev

为什么python 3中的json.dumps()返回python 2的不同值?

来自分类Dev

为什么是Python线程开始算2?

来自分类Python

为什么(1 == 2!= 3)在Python中评估为False?

来自分类Dev

Python:为什么等待线程占用这么多 CPU

来自分类Dev

为什么有这么多python版本在使用?

来自分类Dev

为什么python字典会占用这么多内存?

来自分类Python

为什么Python 3比Python 2慢很多?

来自分类Dev

为什么repr(float)在Google App Engine上返回的位数比其他数字多

来自分类Dev

为什么float('Inf')是float('Inf')在Python中返回false?

来自分类Dev

为什么Python中没有uuid.uuid2?

来自分类Dev

为什么这 i = (a += 2) 在 Python 中给出 SyntaxError?

来自分类Dev

为什么在Python 1.0中== 1 >>> True; -2.0 == -2 >>> True等?

来自分类Python

为什么在Python 3中不能像在Python 2中那样使用__cmp__方法?

来自分类Dev

为什么在Python3.6中允许使用float('20200407_2')?

来自分类Dev

无法在python 3中获得python 2的确切str(float)结果

来自分类Dev

python是什么,为什么它会定期使用这么多的cpu?

来自分类Dev

为什么 django 2 在 python 2 下可用?

来自分类Dev

为什么在python2和python3中包含路径不同?

来自分类Dev

为什么要通过python2运行guake,但错误中存在“ python3”?

来自分类Dev

为什么 Python 为 [0xfor x in (1, 2, 3)] 返回 [15]?

来自分类Python

为什么range(0)== range(2,2,2)在Python 3中为true?

来自分类Dev

传递1 2 23 32 4在python的max函数中返回4,为什么?

来自分类Dev

python urllib2.urlopen-html文本乱码-为什么?

来自分类Linux

为什么在jinja2 Python中使用“ |安全”

来自分类Dev

为什么我不能安装python opencv2?

Related 相关文章

  1. 1

    为什么我对 2 位数字的 mod (%) 操作在 python 中返回零

  2. 2

    为什么 print(2 == 2.) 在 Python 中返回 True

  3. 3

    为什么在Python 2中''> 0 True?

  4. 4

    为什么在Python中2 **-1025!= 0.0

  5. 5

    为什么python 3中的json.dumps()返回python 2的不同值?

  6. 6

    为什么是Python线程开始算2?

  7. 7

    为什么(1 == 2!= 3)在Python中评估为False?

  8. 8

    Python:为什么等待线程占用这么多 CPU

  9. 9

    为什么有这么多python版本在使用?

  10. 10

    为什么python字典会占用这么多内存?

  11. 11

    为什么Python 3比Python 2慢很多?

  12. 12

    为什么repr(float)在Google App Engine上返回的位数比其他数字多

  13. 13

    为什么float('Inf')是float('Inf')在Python中返回false?

  14. 14

    为什么Python中没有uuid.uuid2?

  15. 15

    为什么这 i = (a += 2) 在 Python 中给出 SyntaxError?

  16. 16

    为什么在Python 1.0中== 1 >>> True; -2.0 == -2 >>> True等?

  17. 17

    为什么在Python 3中不能像在Python 2中那样使用__cmp__方法?

  18. 18

    为什么在Python3.6中允许使用float('20200407_2')?

  19. 19

    无法在python 3中获得python 2的确切str(float)结果

  20. 20

    python是什么,为什么它会定期使用这么多的cpu?

  21. 21

    为什么 django 2 在 python 2 下可用?

  22. 22

    为什么在python2和python3中包含路径不同?

  23. 23

    为什么要通过python2运行guake,但错误中存在“ python3”?

  24. 24

    为什么 Python 为 [0xfor x in (1, 2, 3)] 返回 [15]?

  25. 25

    为什么range(0)== range(2,2,2)在Python 3中为true?

  26. 26

    传递1 2 23 32 4在python的max函数中返回4,为什么?

  27. 27

    python urllib2.urlopen-html文本乱码-为什么?

  28. 28

    为什么在jinja2 Python中使用“ |安全”

  29. 29

    为什么我不能安装python opencv2?

热门标签

归档