为什么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 __setattr__、 __getattr__、 __delattr__、__call__用法示例
Mar 06 Python
Python生成随机MAC地址
Mar 10 Python
Python编程中的文件操作攻略
Oct 16 Python
Python正则抓取新闻标题和链接的方法示例
Apr 24 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
Python统计单词出现的次数
Apr 04 Python
详解python分布式进程
Oct 08 Python
python得到单词模式的示例
Oct 15 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
Python图像处理库PIL详细使用说明
Apr 06 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数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
2016/05/18 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
利用Python中的输入和输出功能进行读取和写入的教程
2015/04/14 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
python实现杨辉三角思路
2017/07/14 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Python实现Restful API的例子
2019/08/31 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Photobook澳大利亚:制作相片书,婚礼卡,旅行相簿
2017/01/12 全球购物
英国首屈一指的票务公司:See Tickets
2019/05/11 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
会计学应届毕业生推荐信
2013/11/04 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
九月份红领巾广播稿
2014/01/22 职场文书
开业主持词
2014/03/21 职场文书
忠诚奉献演讲稿
2014/09/12 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年度个人工作总结
2014/11/07 职场文书
小学生学习保证书
2015/02/26 职场文书
学校党支部承诺书
2015/04/30 职场文书
社会实践单位意见
2015/06/05 职场文书
遗失证明范文
2015/06/19 职场文书
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸