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


Posted in Python onOctober 16, 2018

在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返回更多的数字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python基于动态规划算法计算单词距离
Jul 25 Python
python输入错误密码用户锁定实现方法
Nov 27 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
Python中存取文件的4种不同操作
Jul 02 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
python 读写excel文件操作示例【附源码下载】
Jun 19 Python
python获取Pandas列名的几种方法
Aug 07 Python
jenkins配置python脚本定时任务过程图解
Oct 29 Python
500行python代码实现飞机大战
Apr 24 Python
Django migrate报错的解决方案
May 20 Python
对PyTorch中inplace字段的全面理解
May 22 Python
Python集合set()使用的方法详解
Mar 18 Python
对python添加模块路径的三种方法总结
Oct 16 #Python
Python中的CSV文件使用"with"语句的方式详解
Oct 16 #Python
详解django的serializer序列化model几种方法
Oct 16 #Python
Python调用C++,通过Pybind11制作Python接口
Oct 16 #Python
Python之inspect模块实现获取加载模块路径的方法
Oct 16 #Python
django 将model转换为字典的方法示例
Oct 16 #Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 #Python
You might like
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
PHP PDOStatement::debugDumpParams讲解
2019/01/30 PHP
表单的一些基本用法与技巧
2006/07/15 Javascript
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
Js基础学习资料
2010/11/23 Javascript
关于JavaScript与HTML的交互事件
2013/04/12 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
Javascript全局变量var与不var的区别深入解析
2013/12/09 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
浅谈struts1 & jquery form 文件异步上传
2017/05/25 jQuery
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
node.js文件的复制、创建文件夹等相关操作
2021/02/05 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
python构建深度神经网络(DNN)
2018/03/10 Python
详解Python3.6安装psutil模块和功能简介
2018/05/30 Python
python使用turtle库绘制树
2018/06/25 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
pytorch逐元素比较tensor大小实例
2020/01/03 Python
Python模块相关知识点小结
2020/03/09 Python
Python中的流程控制详解
2021/02/18 Python
印尼在线旅游门户网站:NusaTrip
2019/11/01 全球购物
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
人力管理专业毕业生求职信
2014/02/27 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
个人对照检查材料思想汇报(四风问题)
2014/09/25 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书