在Python中是否有相当于//运算符的上限?

我发现了Python中的/运算符,它在Python 3中与floor进行了划分。

是否有运营商与ceil分开? (我知道在Python 3中进行浮点除法的/运算符。)

Cradam asked 2019-09-11T05:02:57Z
7个解决方案
230 votes

你可以做颠倒的地板部门:

def ceildiv(a, b):
    return -(-a // b)

这是有效的,因为Python的除法运算符进行了分区(与C不同,整数除法截断了小数部分)。

这也适用于Python的大整数,因为没有(有损)浮点转换。

这是一个演示:

>>> from __future__ import division   # a/b is float division
>>> from math import ceil
>>> b = 3
>>> for a in range(-7, 8):
...     print(["%d/%d" % (a, b), int(ceil(a / b)), -(-a // b)])
... 
['-7/3', -2, -2]
['-6/3', -2, -2]
['-5/3', -1, -1]
['-4/3', -1, -1]
['-3/3', -1, -1]
['-2/3', 0, 0]
['-1/3', 0, 0]
['0/3', 0, 0]
['1/3', 1, 1]
['2/3', 1, 1]
['3/3', 1, 1]
['4/3', 2, 2]
['5/3', 2, 2]
['6/3', 2, 2]
['7/3', 3, 3]
dlitz answered 2019-09-11T05:03:59Z
50 votes

没有运营商与ceil分开。 您需要import math并使用math.ceil

Charles Salvia answered 2019-09-11T05:03:13Z
17 votes

当将x除以d,即(x + 4) // 5时,可以执行(x + (d-1)) // d

poke answered 2019-09-11T05:04:24Z
14 votes

你也可以随便进行内联

((foo - 1) // bar) + 1

在python3中,这比强制浮动除法和调用ceil()快一个数量级,只要你关心速度。 你不应该这样做,除非你通过使用证明了你需要的。

>>> timeit.timeit("((5 - 1) // 4) + 1", number = 100000000)
1.7249219375662506
>>> timeit.timeit("ceil(5/4)", setup="from math import ceil", number = 100000000)
12.096064013894647
Travis Griggs answered 2019-09-11T05:04:58Z
8 votes

请注意,math.ceil限制为53位精度。 如果您正在使用大整数,则可能无法获得准确的结果。

gmpy2库提供了c_div函数,它使用了天花板舍入。

免责声明:我维持gmpy2。

casevh answered 2019-09-11T05:05:39Z
3 votes

解决方案1:通过否定将楼层转换为天花板

def ceiling_division(n, d):
    return -(n // -d)

让人联想到Penn&Teller悬浮技巧,这“让世界颠倒(带有否定),使用普通地板分区(天花板和地板已被交换),然后将世界正面朝上(再次否定)“

解决方案2:让divmod()完成工作

def ceiling_division(n, d):
    q, r = divmod(n, d)
    return q + bool(r)

divmod()函数给出了整数的(a // b, a % b)(由于舍入误差,这可能不太可靠。 只要存在非零余数,bool(r)的步骤就会向商添加一个。

解3:在除法前调整分子

def ceiling_division(n, d):
    return (n + d - 1) // d

向上翻译分子,使得分区向下舍入到预期的上限。 注意,这仅适用于整数。

解决方案4:转换为浮点数以使用math.ceil()

def ceiling_division(n, d):
    return math.ceil(n / d)

math.ceil()代码很容易理解,但它从int转换为浮点数和返回值。 这不是很快,可能有舍入问题。 此外,它依赖于Python 3语义,其中“true division”产生一个浮点数,而ceil()函数返回一个整数。

Raymond Hettinger answered 2019-09-11T05:06:50Z
-1 votes

我来到这里是因为二进制模块组,并希望与列表的共享中间进行交互。 例如[1,2,3,4]具有24

要与列表中间进行交互并使用ceiling操作符:

foo    = [1,2,3,4]
length = len(foo)
floor  = (len(foo)//2) -1
ceil   = floor+1
T.Woody answered 2019-09-11T05:07:25Z
translate from https://stackoverflow.com:/questions/14822184/is-there-a-ceiling-equivalent-of-operator-in-python