我最近转换了一个脚本以使用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。
这是为什么?
我知道如果我将a
和b
投反为float
,我可以获得2.7工作:
c = math.ceil(float(a)/float(b)
然而,投入该部门也不会发挥作用:
c = math.ceil(float(a/b))
3.4如何解决这个问题?
发现这一点让我质疑我需要在2.7版本的脚本中重新检查多少数学。
答案 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。