为什么Python 2.7报告的上限值不正确?

时间:2018-06-07 17:22:30

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

我最近转换了一个脚本以使用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版本的脚本中重新检查多少数学。

3 个答案:

答案 0 :(得分:4)

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

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

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

from __future__ import division

答案 1 :(得分:2)

这是因为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

答案 2 :(得分:1)

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