为什么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计算一个序列的平均值的方法
Jul 11 Python
Python利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
Aug 02 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python os.fork() 循环输出方法
Aug 08 Python
如何在 Django 模板中输出 "{{"
Jan 24 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
Apr 21 Python
Python批量处理csv并保存过程解析
May 16 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
python 绘制国旗的示例
Sep 27 Python
Python爬虫后获取重定向url的两种方法
Jan 19 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/01/20 PHP
批量修改RAR文件注释的php代码
2010/11/20 PHP
利用php输出不同的心形图案
2016/04/22 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
javascript 四则运算精度修正函数代码
2010/05/31 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
Vue异步加载about组件
2017/10/31 Javascript
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
vuex页面刷新后数据丢失的方法
2019/01/17 Javascript
对Python的Django框架中的项目进行单元测试的方法
2016/04/11 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
详解python 爬取12306验证码
2019/05/10 Python
python redis连接 有序集合去重的代码
2019/08/04 Python
Django之路由层的实现
2019/09/09 Python
python爬虫爬取网页数据并解析数据
2020/09/18 Python
EQVVS官网:设计师男装和女装
2018/10/24 全球购物
婴儿地球:Baby Earth
2018/12/25 全球购物
软件工程专业推荐信
2013/10/28 职场文书
淘宝中秋节活动方案
2014/01/31 职场文书
房展策划方案
2014/06/07 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
关于环保的宣传稿
2015/07/23 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
2015年秋季运动会广播稿
2015/08/19 职场文书
四年级作文之说明文作文
2019/10/14 职场文书
Python数据分析入门之数据读取与存储
2021/05/13 Python
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python