为什么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根据京东商品url获取产品价格
Aug 09 Python
python基于物品协同过滤算法实现代码
May 31 Python
Python实现图片转字符画的代码实例
Feb 22 Python
Python类中的魔法方法之 __slots__原理解析
Aug 26 Python
Pytorch 使用不同版本的cuda的方法步骤
Apr 02 Python
Python如何定义有可选参数的元类
Jul 31 Python
python如何实现图片压缩
Sep 11 Python
python如何实时获取tcpdump输出
Sep 16 Python
一劳永逸彻底解决pip install慢的办法
May 24 Python
python中的装饰器该如何使用
Jun 18 Python
Python 数据科学 Matplotlib图库详解
Jul 07 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 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下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
PHP实现删除非站内外部链接实例代码
2014/06/17 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP中Notice错误常见解决方法
2017/04/28 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
2020/04/06 PHP
JavaScript中的事件处理
2008/01/16 Javascript
jQuery的one()方法用法实例
2015/01/19 Javascript
JavaScript中创建字典对象(dictionary)实例
2015/03/31 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
2018/08/31 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
js实现旋转木马轮播图效果
2020/01/10 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
python的mysqldb安装步骤详解
2017/08/14 Python
Python多线程扫描端口代码示例
2018/02/09 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Python json模块与jsonpath模块区别详解
2020/03/05 Python
CSS3动画之流彩文字效果+图片模糊效果+边框伸展效果实现代码合集
2017/08/18 HTML / CSS
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
毕业生找工作推荐信
2013/11/21 职场文书
董事长秘书岗位职责
2013/11/29 职场文书
师范生的个人求职信范文
2014/01/04 职场文书
车间安全生产标语
2014/06/06 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
政风行风评议整改方案
2014/09/15 职场文书
甜品店创业计划书
2014/09/21 职场文书
学风建设主题班会
2015/08/17 职场文书