为什么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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python中使用logging模块代替print(logging简明指南)
Jul 09 Python
Python 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
基于django2.2连oracle11g解决版本冲突的问题
Jul 02 Python
DRF框架API版本管理实现方法解析
Aug 21 Python
基于CentOS搭建Python Django环境过程解析
Aug 24 Python
利用Selenium添加cookie实现自动登录的示例代码(fofa)
May 08 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 快速生成 Flash 动画的方法
2007/03/06 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
基于JQuery的多标签实现代码
2012/09/19 Javascript
jQuery控制Div拖拽效果完整实例分析
2015/04/15 Javascript
angularjs过滤器--filter与ng-repeat配合有奇效
2017/04/20 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
Vue实现数字输入框中分割手机号码的示例
2017/10/10 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
python密码错误三次锁定(实例讲解)
2017/11/14 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
python整小时 整天时间戳获取算法示例
2019/02/20 Python
详解python读取image
2019/04/03 Python
matlab、python中矩阵的互相导入导出方式
2020/06/01 Python
python中如何设置代码自动提示
2020/07/15 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
Pycharm如何自动生成头文件注释
2020/11/14 Python
CSS3实例分享--超炫checkbox复选框和radio单选框
2014/09/01 HTML / CSS
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
canvas线条的属性详解
2018/03/27 HTML / CSS
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
小学生作文评语大全
2014/04/21 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2016年国庆节67周年活动总结
2016/04/01 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书