为什么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下的Mysql模块MySQLdb安装详解
Apr 09 Python
在Docker上开始部署Python应用的教程
Apr 17 Python
Python实现将DOC文档转换为PDF的方法
Jul 25 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python实现二分查找与bisect模块详解
Jan 13 Python
Python探索之创建二叉树
Oct 25 Python
Python网络编程详解
Oct 31 Python
对python requests发送json格式数据的实例详解
Dec 19 Python
对Python w和w+权限的区别详解
Jan 23 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 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程序员工具
2008/05/26 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
destoon实现调用图文新闻的方法
2014/08/21 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
json的前台操作和后台操作实现代码
2012/01/20 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
把Node.js程序加入服务实现随机启动
2015/06/25 Javascript
使用微信内置浏览器点击下拉框出现页面乱跳转现象(iphone),该怎么办
2016/01/04 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
javascript实现根据函数名称字符串动态执行函数的方法示例
2016/12/28 Javascript
JavaScript制作简易计算器(不用eval)
2017/02/05 Javascript
jQuery插件HighCharts绘制的基本折线图效果示例【附demo源码下载】
2017/03/07 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
详解angular用$sce服务来过滤HTML标签
2017/04/11 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
vue实现微信分享功能
2018/11/28 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
JS创建自定义对象的六种方法总结
2020/12/15 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
Python线性方程组求解运算示例
2018/01/17 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python类的实例化问题解决
2019/08/31 Python
德国婴儿推车和儿童安全座椅商店:BABYSHOP
2016/09/01 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
保护环境的建议书
2014/03/12 职场文书
爱护草坪标语
2014/06/24 职场文书
危货运输企业安全生产责任书
2014/07/28 职场文书
python 解决微分方程的操作(数值解法)
2021/05/26 Python
redis的list数据类型相关命令介绍及使用
2022/01/18 Redis
拙作再改《我的收音机情缘》
2022/04/05 无线电