Python中是否有//等于//的运算符?

问题描述:

我发现了Python中的//运算符,它在Python 3中与floor进行了划分。Python中是否有//等于//的运算符?

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

+0

“除以当时的小区”是不是真的在数学常见的事,而''//基于整数除法,与模量操作。 – millimoose 2013-02-11 22:39:28

+0

重要提示:你需要一个整型还是浮点型结果? – smci 2015-06-25 06:36:28

+3

你应该改变对dlitz的接受答案。 math.ceil用于浮点数,它不适用于Python的任意精度长整数。 – endolith 2016-05-01 17:50:22

没有运算符与ceil分开。您需要import math,并使用math.ceil

+0

so foobar = math.ceil(foo/bar)?嗯,我可以忍受这一点,不知道我想用什么,只是好奇,谢谢 – Cradam 2013-02-11 22:51:07

+8

-1 **不使用**,这将开始失败的非常大的整数。请使用多精度算术库或使用[this](https://*.com/a/17511341/674039)方法保留在整数域中。 – wim 2017-05-30 20:21:28

你可以做(x + (d-1)) // dxd,即(x + 4) // 5

+0

这是我永远使用的经典方法。尽管如此,它不适用于消极的因子。 – 2013-07-08 16:20:27

+0

它生成[相同的结果](https://repl.it/FZGd/5)作为'math.ceil()'。 – Abhijeet 2017-01-30 05:54:43

+0

@Abhijeet是的,这就是问题所在。除了'sys.float_info.max'之上的大整数更好的工作,它不需要导入。 – Artyer 2017-05-10 19:01:40

你总是可以做它内联以及

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

在python3,这只是害羞一个数量级比迫使浮分工,并要求小区()快的,只要你关心的速度。你不应该这样做,除非你已经通过使用证明了你需要。

>>> timeit.timeit("((5 - 1) // 4) + 1", number = 100000000) 
1.7249219375662506 
>>> timeit.timeit("ceil(5/4)", setup="from math import ceil", number = 100000000) 
12.096064013894647 
+0

只是自己跑了那些测试我得到了大约12.5秒,ehrm,为什么我不在乎速度如此巨大的速度差? – Cradam 2013-02-11 23:17:02

+2

@Cradam请注意,他正在使用1亿个电话('号码= 100000000')。每次通话,差异是非常微不足道的。 – 2013-02-11 23:19:37

+0

啊,谢谢,我将使用ceil方法,然后 – Cradam 2013-02-11 23:23:35

请注意,math.ceil限于53位的精度。如果你使用大整数,你可能得不到确切的结果。

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

声明:我维护gmpy2。

+2

如果我正在做重要的数学或科学研究,这个软件包会很有用,但我更喜欢使用核心库的答案。我给予upvote,因为它是一个有用的答案 – Cradam 2013-02-12 13:38:19

你可以做倒楼师:

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

这工作,因为Python's division operator does floor division(不像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] 
+11

哇!很聪明!这应该是可以接受的解决方案。 – apadana 2016-04-19 21:29:25