整数除法到下一个整数
Integer division to next integer
如您所知,如果您这样做:
>>> 11/2
# 5
和
>>> 11/2.0
# 5.5
在这种情况下我想得到 6 个。我试过:
>>> 11//2
# 5
和
>>> 11//2.0
# 5.0
最后一个给出上一个整数。我想得到下一个整数。
即使是结果也像 x.1
我想得到 (x+1)
.
我该怎么做?
>>> import math
>>> math.ceil(11/2.0)
6.0
>>>
rounded_up = x // y + bool(x % y)
如果除法产生非零余数,我们加 1。这样做的好处是不会引入浮点不精确,因此在 math.ceil
产生错误答案的极端情况下它是正确的。
我们也可以用floor除法和两个取反进行运算:
rounded_up = -(-x // y)
-x/y的下限是x/y的上限的负数,所以再次取反产生x/y的上限。同样,我们通过在整数算术中执行所有操作来避免浮点舍入错误。
通常比同时进行模数和除法工作更有效,转换地板除法很容易:
x // y
分为 ceil
除法(与使用 math.ceil
不同,它不会因为大值的浮点不精确而导致得到不正确结果的风险):
(x + y - 1) // y
如果 x
可以被 y
整除,那么添加 y - 1
没有任何改变;楼层划分使最终结果不变。如果它不能被整除,这会将它增加到下一个倍数之上,让你只用一次除法运算而不是两次除法(除法很昂贵;做两次是双倍的昂贵),并且没有浮点精度问题。
如您所知,如果您这样做:
>>> 11/2
# 5
和
>>> 11/2.0
# 5.5
在这种情况下我想得到 6 个。我试过:
>>> 11//2
# 5
和
>>> 11//2.0
# 5.0
最后一个给出上一个整数。我想得到下一个整数。
即使是结果也像 x.1
我想得到 (x+1)
.
我该怎么做?
>>> import math
>>> math.ceil(11/2.0)
6.0
>>>
rounded_up = x // y + bool(x % y)
如果除法产生非零余数,我们加 1。这样做的好处是不会引入浮点不精确,因此在 math.ceil
产生错误答案的极端情况下它是正确的。
我们也可以用floor除法和两个取反进行运算:
rounded_up = -(-x // y)
-x/y的下限是x/y的上限的负数,所以再次取反产生x/y的上限。同样,我们通过在整数算术中执行所有操作来避免浮点舍入错误。
通常比同时进行模数和除法工作更有效,转换地板除法很容易:
x // y
分为 ceil
除法(与使用 math.ceil
不同,它不会因为大值的浮点不精确而导致得到不正确结果的风险):
(x + y - 1) // y
如果 x
可以被 y
整除,那么添加 y - 1
没有任何改变;楼层划分使最终结果不变。如果它不能被整除,这会将它增加到下一个倍数之上,让你只用一次除法运算而不是两次除法(除法很昂贵;做两次是双倍的昂贵),并且没有浮点精度问题。