当前位置: 首页 > 面试题库 >

为什么在Python 3中str(float)返回的位数要比Python 2多?

马星阑
2023-03-14
问题内容

在Python
2.7中,repr的afloat返回最接近的十进制数字,最长为17位;这足够精确以唯一地标识每个可能的IEEE浮点值。strfloat工作类似,不同之处在于它限制了结果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中,它出现strrepr返回相同的东西。

Python
3演示:http://ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996

是否有描述变更的PEP或负责人的其他声明?


问题答案:

不,没有PEP。错误跟踪器中有一个问题,Python开发人员邮件列表中有相关的讨论。尽管我负责提出和实施更改,但我不能断言这是我的主意:它是在EuroPython
2010上与Guido进行对话时产生的。

更多详细信息:正如注释中已经提到的那样,Python 3.1引入了一个用于reprfloat字符串的新算法(后来反向移植到Python
2系列,因此它也出现在Python
2.7中)。这种新算法的结果是,在提示符下键入的“短”十进制数字具有相应的短表示形式。这消除之间的差额现有的原因之一str,并repr,并有可能使用相同的算法都strrepr。因此对于Python
3.2,下面的讨论与上面链接在一起,str并且repr变得相同。至于原因:它使语言更小,更整洁,并且在输出字符串时消除了任意选择的12位数字。(选择的17位数字用于repr
顺便说一句,在2.7之前的Python版本中,绝不是任意的:两个不同的IEEE 754
binary64浮点数在转换为带有17个有效数字的十进制时将具有不同的表示形式,而17是具有此属性的最小整数。)

除了简单之外,还有一些不太明显的好处。过去让用户感到困惑的reprvsstr区分的一个方面是repr自动在容器中使用的事实。因此,例如在Python
2.7中:

>>> x = 1.4 * 1.5
>>> print x
2.1
>>> print [x]
[2.0999999999999996]

我敢肯定至少有一个StackOverflow问题在某处询问此现象:这是一个这样的问题,另一个是最近的问题。通过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返回更多的数字,包括了为什么str(float)在Python 3中比Python 2返回更多的数字的使用技巧和注意事项,需要的朋友参考一下 在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值.浮点数的str类似地工作,除了它将结果限制为12位数;对于

  • 问题内容: 命名函数的返回参数有什么好处? 问题答案: 命名它们有一些好处: 它用作文档。 它们会自动声明并初始化为零值。 如果您有多个返回站点,则更改函数的返回值并不需要全部更改,因为它只会显示“ return”。 还有缺点,主要是很容易通过声明相同名称的变量来意外地遮盖它们。 有效的Go中有一个关于命名结果参数的部分: 可以给Go函数的返回或结果“参数”指定名称,并将其用作常规变量,就像传入参

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

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

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

  • 问题内容: 什么时候以及为什么要使用JavaScript? 问题答案: 通常,在事件处理程序(如中)中,返回false是一种告诉事件实际上未触发的方法。因此,在这种情况下,这意味着将不提交表单。

  • 问题内容: 我知道Go没有任何构造函数,而是在其中使用a ,但是根据此示例。 他们总是回来。为什么仅仅返回就还不够? 更新资料 我尝试过为简单的结构返回创建的对象,这很好。因此,我想知道返回地址是否是构造函数的标准方法或其他方法。 谢谢。 问题答案: 如前所述,是的,规范允许您返回值(作为非指针)或指针。这只是您必须做出的决定。 什么时候返回指针? 通常,如果您返回的值作为指针“更有用”。什么时候