当前位置: 首页 > 编程笔记 >

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

冯峻
2023-03-14
本文向大家介绍为什么str(float)在Python 3中比Python 2返回更多的数字,包括了为什么str(float)在Python 3中比Python 2返回更多的数字的使用技巧和注意事项,需要的朋友参考一下

在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或某人负责的其他html" target="_blank">声明?

不,没有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返回更多的数字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对小牛知识库网站的支持!

 类似资料:
  • 问题内容: 如果我在节点repl中执行此指令 它返回 我希望它返回前三个项目,其他值从何而来? 问题答案: 数组中的第一项是整个正则表达式匹配项(“组0”)。那当然是。 第二项是第一个捕获组的match的内容。这是又响了。 第三项是第二个捕获组的match的内容。那是之后的空字符串。 是比赛开始的位置-这是字符串的第一个字符。 向您显示执行regex的字符串,即。 很难找到关于此的文档(至少对我而

  • 为什么numeric_limits::min返回一个负值为int,但正值为例如浮动和双? 输出: 参考文献: 返回可由数字类型T表示的最小有限值。 对于具有反规范化的浮点类型,min返回最小的正规范化值。请注意,这种行为可能是意外的,特别是与整型类型的min行为相比。要查找没有值小于它的值,请使用。 min仅对有界类型和无界无符号类型有意义,也就是说,表示无穷多个负值的类型没有意义的最小值。

  • 问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B

  • 我正在学习指针是如何工作的,但我不明白这段代码中的一件事。在void*函数中返回int就像一个咒语,但是返回float就不是了。

  • 问题内容: 我们正在开发对延迟敏感的应用程序,并且已经对各种方法(使用jmh)进行了微基准测试。在对基准测试方法进行微基准测试并对结果满意之后,我实现了最终版本,但发现最终版本比我基准测试的 速度慢 了 3倍 。 罪魁祸首是所实现的方法正在返回一个对象而不是一个对象。这是基准代码的简化版本: 以上基准测试结果: 只需更改函数的返回类型,就可以将性能提高近三倍。 我认为返回枚举对象与整数之间的唯一区

  • 问题内容: 我有一个简单的Java类,如下所示: 这段代码的输出是这样的: 为什么s不在finally块中覆盖,而是控制打印输出? 问题答案: 在与所述的执行块完成语句和的值在时间语句执行是由该方法返回的值。finally子句稍后s(在语句完成之后)更改值的事实(此时)并未更改返回值。 请注意,以上内容处理的s是对块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不