为什么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中encode()方法的使用简介
May 18 Python
python显示生日是星期几的方法
May 27 Python
详解Python Socket网络编程
Jan 05 Python
Python实现字符串与数组相互转换功能示例
Sep 22 Python
python函数式编程学习之yield表达式形式详解
Mar 25 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Python多进程fork()函数详解
Feb 22 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
django+echart数据动态显示的例子
Aug 12 Python
Python拼接字符串的7种方式详解
Mar 19 Python
增大python字体的方法步骤
Jul 05 Python
Python import模块的缓存问题解决方案
Jun 02 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两种去掉数组重复值的方法比较
2014/06/19 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
php简单复制文件的方法
2016/05/09 PHP
利用jQuery插件扩展识别浏览器内核与外壳的类型和版本的实现代码
2011/10/22 Javascript
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
前端性能优化及技巧
2016/05/06 Javascript
Node.js Addons翻译(C/C++扩展)
2016/06/12 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
详解vue项目接入微信JSSDK的坑
2018/12/14 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
2020/09/04 Javascript
python 换位密码算法的实例详解
2017/07/19 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
python与字符编码问题
2019/05/24 Python
Python实现非正太分布的异常值检测方式
2019/12/09 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python类及获取对象属性方法解析
2020/06/15 Python
实习单位接收函
2014/01/11 职场文书
预备党员党课思想汇报
2014/01/13 职场文书
商务英语广告词大全
2014/03/18 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
婚礼答谢礼品
2015/01/20 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
在职证明范本
2015/06/15 职场文书