2013-02-11 80 views
59

我發現了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

回答

35

沒有運算符與ceil分開。您需要import math,並使用math.ceil

+0

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

+8

-1 **不使用**,這將開始失敗的非常大的整數。請使用多精度算術庫或使用[this](https://stackoverflow.com/a/17511341/674039)方法保留在整數域中。 – wim 2017-05-30 20:21:28

9

你可以做(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

8

你總是可以做它內聯以及

((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

7

請注意,math.ceil限於53位的精度。如果你使用大整數,你可能得不到確切的結果。

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

聲明:我維護gmpy2。

+2

如果我正在做重要的數學或科學研究,這個軟件包會很有用,但我更喜歡使用核心庫的答案。我給予upvote,因爲它是一個有用的答案 – Cradam 2013-02-12 13:38:19

163

你可以做倒樓師:

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

相關問題