代码之家  ›  专栏  ›  技术社区  ›  Sharun

python float-str-float怪异

  •  10
  • Sharun  · 技术社区  · 16 年前
    >>> float(str(0.65000000000000002))
    
    0.65000000000000002
    
    >>> float(str(0.47000000000000003))
    
    0.46999999999999997     ???
    

    这是怎么回事? 我怎么转换 0.47000000000000003 字符串和结果值返回浮动?

    我在Windows上使用的是python 2.5.4。

    4 回复  |  直到 9 年前
        1
  •  16
  •   user180100    16 年前

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

    注: float(repr(0.47000000000000003)) eval(repr(0.47000000000000003)) 会给你预期的结果,但是你应该使用 Decimal 如果你需要精确。

        2
  •  3
  •   Alex Budovski    16 年前

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

        3
  •  2
  •   Nick Craig-Wood    16 年前

    这是一个 Python FAQ

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

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

    Decimal 是一个很好的选择,如果你想要更多的速度和选择 gmpy 也很棒。

        4
  •  0
  •   Supot Sawangpiriyakij    11 年前

    通过这个例子 我认为这是Python中的一个错误

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

    简单的方法,我用这个解决这个问题

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