【问题标题】:Division by 3 in PythonPython中的除以3
【发布时间】:2015-06-07 09:03:18
【问题描述】:

我是 Python 新手,在尝试运算符时,我遇到了这个问题:

>>> 7.0 / 3
2.3333333333333335

结果不应该是 2.3333333333333333 还是 2.3333333333333334。为什么要这样四舍五入呢?

另外,关于 Python 2.7 中的楼层划分,我的结果是:

>>> 5 / 2
2
>>> 5 // 2
2
>>> 5.0 / 2
2.5
>>> 5.0 // 2
2.0

所以我的观察是,即使在浮点数的情况下,地板除法也会返回整数商,而普通除法返回十进制值。这是真的吗?

【问题讨论】:

标签: python division floor


【解决方案1】:

看看这个0.30000000000000004.com

您的语言没有损坏,它正在做浮点数学运算。计算机本身只能存储整数,因此它们需要某种方式来表示十进制数。这种表示带有某种程度的不准确。这就是为什么,通常是 .1 + .2 != .3。

【讨论】:

    【解决方案2】:

    结果不应该是 2.3333333333333333 还是 2.3333333333333334。为什么要这样四舍五入呢?

    关键是数字被四舍五入。

    第一次舍入是除法运算的一部分,将数字四舍五入到最接近的双精度浮点值。这是二进制运算而不是十进制运算。

    第二次舍入是将浮点数转换为十进制表示以供显示的一部分。 可以用十进制表示任何二进制分数的精确值,但通常不希望这样做,因为在大多数应用程序中这样做只会导致许多数字的错误精度。 Python 改为输出最短的十进制近似值,该近似值将往返到正确的浮点值。

    我们可以通过使用 Fraction 和 Decimal 类型更好地了解发生了什么,这与直接转换为字符串不同,将浮点数转换为 Fraction 或 Decimal 会给出确切的值。我们还可以使用 Fraction 类型来确定计算中的误差。

    >>> from fractions import Fraction
    >>> from decimal import Decimal
    >>> 7.0 / 3
    2.3333333333333335
    >>> Decimal(7.0 / 3)
    Decimal('2.333333333333333481363069950020872056484222412109375')
    >>> Fraction(7.0 / 3)
    Fraction(5254199565265579, 2251799813685248)
    >>> Fraction(7,3) - Fraction(7.0 / 3)
    Fraction(-1, 6755399441055744)
    

    通过 Decimal 类型进行的转换向我们展示了浮点数的确切值,并演示了通常由浮点值精确转换为十进制导致的多位错误精度。

    转换为分数也很有趣,分母是 2251799813685248,相当于 251。这很有意义,双精度浮点数有 53 个有效位尾数,我们需要其中两个作为结果的整数部分,剩下 51 个作为小数部分。

    我们的浮点计算中的错误是 1/6755399441055744 或 ⅓ * 2-51。这个误差小于我们精度步长 2-51 的一半,因此答案确实正确地四舍五入为双精度浮点值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 2019-07-24
      • 2019-10-11
      • 2013-08-13
      • 1970-01-01
      • 2018-07-04
      相关资源
      最近更新 更多