【问题标题】:Python float - str - float weirdnessPython float - str - 浮动怪异
【发布时间】:2010-12-19 04:48:05
【问题描述】:
>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

这里发生了什么? 如何将0.47000000000000003 转换为字符串并将结果值转换回浮点数?

我在 Windows 上使用 Python 2.5.4。

【问题讨论】:

  • RC:我想很多人(是的,程序员也是)不知道 IEEE 754 定义了浮点数(不是每个人都阅读语言规范 :-))。所以我实际上认为“浮点”标签会是一个更好的选择,除非有关于标准本身的具体问题。
  • 问这类问题的人肯定不知道 ieee-754 是什么...
  • 不知道浮点标记,但确定它比规范的名称更好。

标签: python string floating-point floating-accuracy ieee-754


【解决方案1】:

str(0.47000000000000003)'0.47'float('0.47') 可以是0.46999999999999997。 这是由于浮点数的表示方式(参见这篇wikipedia 文章)

注意:float(repr(0.47000000000000003))eval(repr(0.47000000000000003)) 将为您提供预期的结果,但如果您需要精度,则应使用 Decimal

【讨论】:

  • 注意:这里使用小数不仅是为了精确,也是为了准确。
  • 我不确定,但我认为“精确度”和“精确度”是同义词,精确度是常用术语。
  • en.wikipedia.org/wiki/Precision_vs._accuracy - 讨论的数字非常精确,但讨论的问题是它们不准确。
【解决方案2】:

float(和 double)没有无限精度。对它们进行操作时,自然会出现舍入误差。

【讨论】:

    【解决方案3】:

    这是Python FAQ

    quite regularly in comp.lang.python 也会出现同样的问题。

    我认为这是一个常见问题解答的原因是因为 python 在所有其他方面都是完美的 ;-),我们希望它能够完美地执行算术 - 就像我们在学校所教的一样。然而,任何上过数值方法课程的人都会告诉你,浮点数距离完美还有很长的路要走。

    Decimal 是一个不错的选择,如果您想要更快的速度和更多的选择,gmpy 也很棒。

    【讨论】:

      【解决方案4】:

      通过这个例子 我认为这是您定义时 Python 中的错误

          >>> print(int(((48/5.0)-9)*5))
          2
      

      简单的方法,我就是这样解决这个问题的

          >>> print(int(round(((48/5.0)-9)*5,2)))
          3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 2014-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多