为什么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中正则表达式的用法实例汇总
Aug 18 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
python实现抖音视频批量下载
Jun 20 Python
python多线程同步之文件读写控制
Feb 25 Python
Django实现文件上传和下载功能
Oct 06 Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
pandas分组聚合详解
Apr 10 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
Python+OpenCV图像处理—— 色彩空间转换
Oct 22 Python
Python如何telnet到网络设备
Feb 18 Python
Python OpenCV超详细讲解调整大小与图像操作的实现
Apr 02 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上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
Yii把CGridView文本框换成下拉框的方法
2014/12/03 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
PHP下载文件函数与用法示例
2019/09/27 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
js 格式化时间日期函数小结
2010/03/20 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
jquery仿QQ登录账号选择下拉框效果
2016/03/22 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
vue滚动轴插件better-scroll使用详解
2017/10/17 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
在Python的web框架中配置app的教程
2015/04/30 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
python3 selenium自动化 frame表单嵌套的切换方法
2019/08/23 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
Python3爬虫ChromeDriver的安装实例
2021/02/06 Python
super()与this()的区别
2016/01/17 面试题
cf战队收人广告词
2014/03/14 职场文书
2015大学生暑假调查报告
2015/07/13 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书