# Is there a ceiling equivalent of // operator in Python?

## Question:

I found out about the `//` operator in Python which in Python 3 does division with floor.

Is there an operator which divides with ceil instead? (I know about the `/` operator which in Python 3 does floating point division.)

There is no operator which divides with ceil. You need to `import math` and use `math.ceil`

You could do `(x + (d-1)) // d` when dividing `x` by `d`, e.g. `(x + 4) // 5`.

You can always just do it inline as well

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

In python3, this is just shy of an order of magnitude faster than forcing the float division and calling ceil(), provided you care about the speed. Which you shouldn’t, unless you’ve proven through usage that you need to.

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

Note that math.ceil is limited to 53 bits of precision. If you are working with large integers, you may not get exact results.

The gmpy2 libary provides a `c_div` function which uses ceiling rounding.

Disclaimer: I maintain gmpy2.

No, but you can use upside-down floor division:¹

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

This works because Python’s division operator does floor division (unlike in C, where integer division truncates the fractional part).

Here’s a demonstration:

``````>>> from __future__ import division     # for Python 2.x compatibility
>>> import math
>>> def ceildiv(a, b):
...     return -(a // -b)
...
>>> b = 3
>>> for a in range(-7, 8):
...     q1 = math.ceil(a / b)   # a/b is float division
...     q2 = ceildiv(a, b)
...     print("%2d/%d %2d %2d" % (a, b, q1, q2))
...
-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
``````

## Why this instead of math.ceil?

`math.ceil(a / b)` can quietly produce incorrect results, because it introduces floating-point error. For example:

``````>>> from __future__ import division     # Python 2.x compat
>>> import math
>>> def ceildiv(a, b):
...     return -(a // -b)
...
>>> x = 2**64
>>> y = 2**48
>>> ceildiv(x, y)
65536
>>> ceildiv(x + 1, y)
65537                       # Correct
>>> math.ceil(x / y)
65536
>>> math.ceil((x + 1) / y)
65536                       # Incorrect!
``````

In general, it’s considered good practice to avoid floating-point arithmetic altogether unless you specifically need it. Floating-point math has several tricky edge cases, which tends to introduce bugs if you’re not paying close attention. It can also be computationally expensive on small/low-power devices that do not have a hardware FPU.

¹In a previous version of this answer, ceildiv was implemented as `return -(-a // b)` but it was changed to `return -(a // -b)` after commenters reported that the latter performs slightly better in benchmarks. That makes sense, because the dividend (a) is typically larger than the divisor (b). Since Python uses arbitrary-precision arithmetic to perform these calculations, computing the unary negation `-a` would almost always involve equal-or-more work than computing `-b`.

## Solution 1: Convert floor to ceiling with negation

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

Reminiscent of the Penn & Teller levitation trick, this “turns the world upside down (with negation), uses plain floor division (where the ceiling and floor have been swapped), and then turns the world right-side up (with negation again)”

## Solution 2: Let divmod() do the work

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

The divmod() function gives `(a // b, a % b)` for integers (this may be less reliable with floats due to round-off error). The step with `bool(r)` adds one to the quotient whenever there is a non-zero remainder.

## Solution 3: Adjust the numerator before the division

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

Translate the numerator upwards so that floor division rounds down to the intended ceiling. Note, this only works for integers.

## Solution 4: Convert to floats to use math.ceil()

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

The math.ceil() code is easy to understand, but it converts from ints to floats and back. This isn’t very fast and it may have rounding issues. Also, it relies on Python 3 semantics where “true division” produces a float and where the ceil() function returns an integer.

Simple solution:
a // b + 1

If you want to celling upto multiple off a number. it works like we have Math.celling in excel.

``````def excel_celling(number=None, multiple_off=None):
quotient = number // multiple_off
reminder = number % multiple_off
celling_value = quotient * multiple_off + (multiple_off, 0)[reminder==0]
return int(celling_value)

assert excel_celling(99.99, 100) == 100, "True"
print(excel_celling(99.99, 100) , 100)
assert excel_celling(1, 100) == 100, "True"
print(excel_celling(1, 100),100)
assert excel_celling(99, 100) == 100, "True"
print(excel_celling(99, 100),100)
assert excel_celling(90, 100) == 100, "True"
print(excel_celling(90, 100),100)
assert excel_celling(101, 100) == 200, "True"
print(excel_celling(101, 100),200)
assert excel_celling(199, 100) == 200, "True"
print(excel_celling(199, 100),200)
assert excel_celling(199.99, 100) == 200, "True"
print(excel_celling(199.99, 100),200)
assert excel_celling(200, 100) == 200, "True"
print(excel_celling(200, 100),200)
``````

Results

100 100

100 100

100 100

100 100

200 200

200 200

200 200

200 200

You can use `-(-a//b)` or `math.ceil(a/b)` from `math` for ceiling division.

Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.