为什么str(float)在Python 3中比Python 2返回更多的数字

 更新时间:2018年10月16日 09:17:46   作者:代码日志  
很多朋友质疑为什么str(float)在Python 3中比Python 2返回更多的数字,在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值。对此问题很多朋友都很疑问,下面小编给大家简单介绍下,需要的朋友可以参考下

在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编程异步爬虫之aiohttp模块的基本用法

    Python编程异步爬虫之aiohttp模块的基本用法

    aiohttp 模块是一个基于 asyncio 的 HTTP 客户端和服务器框架,可以用于异步处理 HTTP 请求和响应,这篇文章给大家介绍Python编程异步爬虫之aiohttp模块的基本用法,感兴趣的朋友一起看看吧
    2024-03-03
  • Python decorator拦截器代码实例解析

    Python decorator拦截器代码实例解析

    这篇文章主要介绍了Python decorator拦截器代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • python3射线法判断点是否在多边形内

    python3射线法判断点是否在多边形内

    这篇文章主要为大家详细介绍了python3射线法判断点是否在多边形内,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • Python使用matplotlib填充图形指定区域代码示例

    Python使用matplotlib填充图形指定区域代码示例

    这篇文章主要介绍了Python使用matplotlib填充图形指定区域代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Python assert语句的简单使用示例

    Python assert语句的简单使用示例

    这篇文章主要给大家介绍了关于Python assert语句的简单使用,文中通过示例代码介绍的非常详细,对大家学习或者使用Python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • 对Pytorch神经网络初始化kaiming分布详解

    对Pytorch神经网络初始化kaiming分布详解

    今天小编就为大家分享一篇对Pytorch神经网络初始化kaiming分布详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python爬取哆啦A梦-伴我同行2豆瓣影评并生成词云图

    Python爬取哆啦A梦-伴我同行2豆瓣影评并生成词云图

    哆啦A梦系列是陪伴我,乃至陪伴了几代人成长的故事.50年来,藤子·F·不二雄先生创造了竹蜻蜓,任意门,时光机器等等无数的新奇道具,让大雄和他的小伙伴们经历了各种冒险,也经历了许多充满戏剧性的啼笑皆非的日常.特意写了这篇文章,教大家怎么绘制词云图,需要的朋友可以参考下
    2021-06-06
  • 如何解决python多种版本冲突问题

    如何解决python多种版本冲突问题

    这篇文章主要介绍了如何解决python多种版本冲突问题,帮助大家更好的进行python开发,感兴趣的朋友可以了解下
    2020-10-10
  • python3转换code128条形码的方法

    python3转换code128条形码的方法

    这篇文章主要介绍了python3转换code128条形码的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • 一文详解如何在Matplotlib中更改图例字体大小

    一文详解如何在Matplotlib中更改图例字体大小

    在我们处理数据的时候,需要对大量的数据进行绘图,就免不了要使用到Matplotlib,下面这篇文章主要给大家介绍了关于如何在Matplotlib中更改图例字体大小的相关资料,需要的朋友可以参考下
    2023-05-05

最新评论