为什么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 相关文章推荐
在Linux系统上安装Python的Scrapy框架的教程
Jun 11 Python
深入理解Python3中的http.client模块
Mar 29 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
OpenCV图像颜色反转算法详解
May 13 Python
python实现简单贪吃蛇游戏
Sep 29 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Python读写yaml文件
Mar 20 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备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
javascript 禁止复制网页
2009/06/11 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
Python模拟登陆实现代码
2017/06/14 Python
Python基于property实现类的特性操作示例
2018/06/15 Python
GitHub 热门:Python 算法大全,Star 超过 2 万
2019/04/29 Python
python与字符编码问题
2019/05/24 Python
Python定时任务APScheduler的实例实例详解
2019/07/22 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
2020/03/06 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
营业经理岗位职责
2013/11/10 职场文书
自荐信封面
2013/12/04 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
中文师范生自荐信
2014/01/30 职场文书
班级入场式解说词
2014/02/01 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
松材线虫病防治方案
2014/06/15 职场文书
教师节主持词开场白
2015/05/29 职场文书
创业计划书之溜冰场
2019/10/25 职场文书
Golang 如何实现函数的任意类型传参
2021/04/29 Golang