为什么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中threading超线程用法实例分析
May 16 Python
Python实现遍历目录的方法【测试可用】
Mar 22 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
Sep 04 Python
详解python常用命令行选项与环境变量
Feb 20 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
在pycharm中无法import所安装的库解决方案
May 31 Python
python实现手机推送 代码也就10行左右
Apr 12 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 IP转换整形(ip2long)的详解
2013/06/06 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
PHP实现抓取迅雷VIP账号的方法
2015/07/30 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
js中confirm实现执行操作前弹出确认框的方法
2014/11/01 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
Vue中使用vee-validate表单验证的方法
2018/05/09 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
vue中如何添加百度统计代码
2020/12/19 Vue.js
vue导入.md文件的步骤(markdown转HTML)
2020/12/31 Vue.js
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
centos下更新Python版本的步骤
2013/02/12 Python
Python数据类型详解(二)列表
2016/05/08 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
java关于string最常出现的面试题整理
2021/01/18 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
优质的学校老师推荐信
2013/10/28 职场文书
新闻发布会主持词
2014/03/28 职场文书
就业协议书样本
2014/08/20 职场文书
中国梦演讲稿范文
2014/08/28 职场文书
大学生个人简历自我评价
2015/03/11 职场文书
大国崛起英国观后感
2015/06/02 职场文书
JavaScript实现优先级队列
2021/12/06 Javascript
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby