为什么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中使用SAX解析xml实例
Nov 21 Python
python实现复制整个目录的方法
May 12 Python
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python探索之创建二叉树
Oct 25 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
Python3爬虫学习入门教程
Dec 11 Python
PyQt5+requests实现车票查询工具
Jan 21 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
python join方法使用详解
Jul 30 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
Sep 20 Python
学python爬虫能做什么
Jul 29 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
YII中assets的使用示例
2014/07/31 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
PHP编程中的Session阻塞问题与解决方法分析
2017/08/07 PHP
php面向对象重点知识分享
2019/09/27 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
jquery validation验证身份证号,护照,电话号码,email(实例代码)
2013/11/06 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
Mongoose中document与object的区别示例详解
2017/09/18 Javascript
angular第三方包开发整理(小结)
2018/04/19 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
[01:20]DOTA2上海特级锦标赛现场采访:谁的ID最受青睐
2016/03/25 DOTA
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Django的URLconf中使用缺省视图参数的方法
2015/07/18 Python
python跳过第一行快速读取文件内容的实例
2018/07/12 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
关于python多重赋值的小问题
2019/04/17 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Django ORM 常用字段与不常用字段汇总
2019/08/09 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python将unicode和str互相转化的实现
2020/05/11 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
python 制作网站小说下载器
2021/02/20 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
介绍下WebSphere的安全性
2013/01/31 面试题
Java如何调用外部Exe程序
2015/07/04 面试题
新闻报道策划方案
2014/06/11 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
数学备课组工作总结
2015/08/12 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
Python如何使用logging为Flask增加logid
2021/03/30 Python
Mysql Innodb存储引擎之索引与算法
2022/02/15 MySQL