【问题标题】:Why does Python 2.7 report incorrect ceiling value? [duplicate]为什么 Python 2.7 报告不正确的上限值? [复制]
【发布时间】:2018-11-17 16:57:07
【问题描述】:

我最近将一个脚本从 3.4 转换为使用 Python 2.7(应同事的要求),但我发现 math.ceil 函数的工作方式不一样...

当我将 5/2 除以 math.ceil() 时,我希望得到 math.ceil(5/2) = 3。

给定以下代码:

from __future__ import print_function
import math

a = 5
b = 2
c = math.ceil(a/b)

print("Ceiling output: {}".format(c))

Python 2.7 将报告 2 作为答案,Python 3.4 按预期报告 3。

这是为什么?

我知道如果我将 ab 转换为 float,我可以让 2.7 工作:

c = math.ceil(float(a)/float(b)

但是,转换除法也不起作用:

c = math.ceil(float(a/b))

3.4 如何解决这个问题?

发现这一点让我质疑我需要在 2.7 版本的脚本中重新检查多少数学。

【问题讨论】:

标签: python python-3.x python-2.7 rounding


【解决方案1】:

这是因为除法运算符/ 在 Python 2.7 中是整数除法。请注意,函数参数在函数调用之前被完全评估,所以math.ceil实际上是一个无辜的旁观者。

math.ceil(5/2)  # same as math.ceil(2)!

要获得 2.7 中的 Python 3 行为,请使用 future 语句:

from __future__ import division

【讨论】:

    【解决方案2】:

    这不是舍入问题,而是默认数字类型问题。 Python 2.7 查看数字并查看整数。由于所有涉及的数字都是整数,5/2 ==> 2 而不是 2.5,所以 ceil() 是 2。注意 / 运算符也会进行浮点除法,前提是至少有一个值是浮点数。因此,如果 x = 5.0 而不是 5,或者如果 y = 2.0 而不是 2,那么您将得到 2.5 ==> ceil() = 3。

    【讨论】:

      【解决方案3】:

      这是因为 Python 2 中的 / 是常规整数除法。

      如果您希望 / 运算符的行为方式与 Python 3 中的方式相同,请将此行添加到您的导入 from __future__ import division

      另外,请注意,如果您想在 Python 3 中进行常规整数除法,请使用 // 而不是 /

      添加导入后你会发现

      In [16]: from __future__ import division
      
      In [17]: a = 5
      
      In [18]: b = 2
      
      In [19]: import math
      
      In [20]: c = math.ceil(a/b)
      
      In [21]: c
      Out[21]: 3.0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-13
        • 2021-12-27
        • 1970-01-01
        • 2014-02-27
        • 2015-12-08
        • 1970-01-01
        相关资源
        最近更新 更多