为什么str(float)在Python 3中比Python 2返回更多的数字

作者:代码日志 时间:2022-11-09 22:55:56 

在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值.浮点数的str类似地工作,除了它将结果限制为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或某人负责的其他声明?

不,没有PEP.错误 * 中有一个 issue ,在Python开发人员邮件列表中有一个 associated discussion

.虽然我负责提出和实施变革,但我不能说这是我的想法:它是在EuroPython 2010与Guido对话时产生的.

一些更多的细节:如评论中已经提到的,Python 3.1为float的string repr引入了一个新的算法(后来被转载到Python 2系列,这样它也出现在Python 2.7中).作为这种新算法的结果,在提示符下键入的“短”十进制数具有相应的较短的表示.这消除了str和repr之间的差异的现有原因之一,并且使得可以对str和repr使用相同的算法.所以对于Python 3.2,按照上面的讨论,str和repr是相同的.至于为什么:它使语言变得更小更干净,并且当输出字符串时,它会删除12位数字的相当随意的选择. (在2.7之前的Python版本中用于repr的17位数字的选择远不是任意的,顺便说一下:两个不同的IEEE 754 binary64浮点数将在转换为十进制时具有不同的表示,17位有效数字,17是最小的整数与此属性.)

除了简单,还有一些不那么明显的好处.过去令用户混淆的repr对str区别的一个方面是repr自动被用于容器.所以例如在Python 2.7中:


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

我确定至少有一个StackOverflow问题询问这个现象: here is one such 和 another 更近一个.通过Python 3.2中引入的简化,我们得到:


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

这是至少更一致的.

如果您确实希望能够隐藏不精确,正确的方法仍然保持不变:使用字符串格式来精确控制输出格式.


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

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

总结

以上所述是小编给大家介绍的为什么str(float)在Python 3中比Python 2返回更多的数字网站的支持!

来源:https://codeday.me/bug/20181016/288321.html

标签:python,str,float
0
投稿

猜你喜欢

  • Python OpenCV去除字母后面的杂线操作

    2023-08-02 15:18:47
  • IE6/7/8/9中Table/Select的innerHTML不能赋值的解决方法

    2024-04-10 16:16:48
  • python绘制散点图和折线图的方法

    2021-08-24 04:27:56
  • 如何判断用户是否非正常离开聊天室?

    2010-01-18 20:30:00
  • 浅析Python 多行匹配模式

    2022-07-23 13:32:18
  • 月影:JavaScript王者归来

    2008-08-05 17:18:00
  • 简单了解python关键字global nonlocal区别

    2023-07-26 15:47:07
  • Python: glob匹配文件的操作

    2023-05-30 00:36:24
  • MySQL数据库的主从同步配置与读写分离

    2024-01-20 17:50:58
  • python开启debug模式的方法

    2023-05-10 02:58:31
  • JavaScript检查数据中是否存在相同的元素(两种方法)

    2024-04-29 13:41:50
  • 详解常用查找数据结构及算法(Python实现)

    2023-02-27 02:03:21
  • jquery的父、子、兄弟节点查找,节点的子节点循环方法

    2023-07-02 05:34:40
  • MySQL深分页问题原理与三种解决方案

    2024-01-27 14:12:34
  • swoole和websocket简单聊天室开发

    2023-10-23 07:20:24
  • opencv 摄像机标定的实现

    2023-09-17 16:08:06
  • Vue使用vux-ui自定义表单验证遇到的问题及解决方法

    2024-05-10 14:18:07
  • 标准的、语义的、Unobtrusive的页签tab切换

    2007-11-03 13:58:00
  • python批量下载网站马拉松照片的完整步骤

    2023-08-31 19:00:27
  • PHP PDOStatement::setAttribute讲解

    2023-06-04 02:48:47
  • asp之家 网络编程 m.aspxhome.com