为什么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 相关文章推荐
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
用python实现简单EXCEL数据统计的实例
Jan 24 Python
python Celery定时任务的示例
Mar 13 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
django Serializer序列化使用方法详解
Oct 16 Python
python设定并获取socket超时时间的方法
Jan 12 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
django项目中使用手机号登录的实例代码
Aug 15 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
pycharm无法安装第三方库的问题及解决方法以scrapy为例(图解)
May 09 Python
python中的垃圾回收(GC)机制
Sep 21 Python
python使用selenium爬虫知乎的方法示例
Oct 28 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
一个基于PDO的数据库操作类
2011/03/24 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP与Perl之间知识点区别整理
2019/03/19 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
JavaScript 学习笔记(十五)
2010/01/28 Javascript
js 强制弹出窗口代码研究-又一款代码
2010/03/20 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
小结Node.js中非阻塞IO和事件循环
2014/09/18 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
ReactNative列表ListView的用法
2017/08/02 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
VueJs组件之父子通讯的方式
2018/05/06 Javascript
create-react-app修改为多页面支持的方法
2018/05/17 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
node+multer实现图片上传的示例代码
2020/02/18 Javascript
Python中用pycurl监控http响应时间脚本分享
2015/02/02 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
如何通过Django使用本地css/js文件
2020/01/20 Python
Python3如何判断三角形的类型
2020/04/12 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
2020/06/11 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
打架检讨书
2015/01/27 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
村党组织公开承诺书
2015/04/30 职场文书
行政二审代理词
2015/05/25 职场文书
独生子女证明范本
2015/06/19 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书