为什么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中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
从Python的源码来解析Python下的freeblock
May 11 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
pycharm下打开、执行并调试scrapy爬虫程序的方法
Nov 29 Python
python实现监控某个服务 服务崩溃即发送邮件报告
Jun 21 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
Python Opencv提取图片中某种颜色组成的图形的方法
Sep 19 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
django 模版关闭转义方式
May 14 Python
Java多线程实现四种方式原理详解
Jun 02 Python
python 匿名函数与三元运算学习笔记
Oct 23 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 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
PHP二维数组排序简单实现方法
2016/02/14 PHP
php数据访问之查询关键字
2016/05/09 PHP
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
javascript实现控制浏览器全屏
2015/03/30 Javascript
javascript算法题:求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2015/04/01 Javascript
Node.js实现Excel转JSON
2015/04/24 Javascript
javascript使用avalon绑定实现checkbox全选
2015/05/06 Javascript
js实现图片放大和拖拽特效代码分享
2015/09/05 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
你不可不知的Vue.js列表渲染详解
2019/10/01 Javascript
如何在wxml中直接写js代码(wxs)
2019/11/14 Javascript
python中map()函数的使用方法示例
2017/09/29 Python
python try except 捕获所有异常的实例
2018/10/18 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python自定义线程池控制线程数量的示例
2019/02/22 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
Python循环结构的应用场景详解
2019/07/11 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Python threading.local代码实例及原理解析
2020/03/16 Python
Python 如何在字符串中插入变量
2020/08/01 Python
英国第二大营养品供应商:Vitabiotics
2016/10/01 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
季度思想汇报
2014/01/01 职场文书
志愿者活动总结
2014/04/28 职场文书
政协调研汇报材料
2014/08/15 职场文书
群众路线剖析材料
2014/09/30 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
生产实习心得体会范文
2016/01/22 职场文书