Округление в большую сторону в Python делает функция math.ceil(): math.ceil(4.2) вернёт 5, а math.ceil(-4.2) вернёт −4. Она подбирает ближайшее целое, которое больше исходного числа или равно ему, и отдаёт результат типом int.
Для деления целых чисел с округлением вверх пишите -(-a // b). Это аналог оператора //, только в обратную сторону: он обходится без импорта и не теряет точность на больших числах. Сам оператор // и другие знаки языка разобраны в статье про операторы Python, а системно язык учат на курсах по Python.
Как округлить число в большую сторону через math.ceil

- Подключите модуль в начале файла:
import math. - Передайте число в функцию:
math.ceil(x). - Сохраните результат в переменную или выведите через
print().
import math
print(math.ceil(4.2)) # 5
print(math.ceil(4.0)) # 4
print(math.ceil(-4.2)) # -4
print(math.ceil(7)) # 7
print(type(math.ceil(4.2))) # <class 'int'>
В документации модуля math ceil описан как наименьшее целое, которое больше x или равно ему. Поэтому целое число возвращается как есть, и 4.0 превращается в 4.
Функция принимает и другие числовые типы, например Decimal и Fraction. Для них Python вызывает метод __ceil__ самого объекта: math.ceil(Fraction(7, 2)) вернёт 4.
Деление с округлением в большую сторону: аналог //
Оператор // делит нацело и округляет результат вниз, к меньшему числу. Отдельного оператора для округления вверх в Python нет, поэтому пользуются одним из трёх приёмов.
| Способ | Пример для 7 и 2 | Когда подходит |
|---|---|---|
-(-a // b) |
4 | Целые числа с любыми знаками, основной вариант |
(a + b - 1) // b |
4 | Только положительный делитель |
math.ceil(a / b) |
4 | Небольшие числа и дробные значения |
Почему работает -(-a // b)
Минус перед делимым переворачивает задачу. Если округлить −3,5 вниз, получится −4, а второй минус превращает −4 в 4. Так выходит округление вверх для исходных 7 и 2.
print(7 // 2) # 3
print(-(-7 // 2)) # 4
print(-(-6 // 2)) # 3
print((7 + 2 - 1) // 2) # 4
Когда число делится без остатка, результат остаётся прежним: 6 на 2 даёт 3. Единицу сверху «добавляет» как раз остаток, и про оператор % с отрицательными числами есть отдельная инструкция по остатку от деления.
Когда math.ceil(a / b) ошибается
По справочнику языка оператор / возвращает float даже для двух целых. У float ограниченная точность: целые больше 253 (это 9 007 199 254 740 992) он хранит точно уже не все.
import math
a = 10**17 + 1
print(math.ceil(a / 1)) # 100000000000000000
print(-(-a // 1)) # 100000000000000001
На идентификаторах и суммах в копейках такая ошибка проходит без всякого сообщения. Для целых берите -(-a // b): деление нацело оставляет результат целым, а целые в Python, как сказано в описании встроенных типов, имеют неограниченную точность.
Формула (a + b - 1) // b подводит на отрицательном делителе. Для 7 и −2 она даёт −2, а правильный ответ −3.
import math
print((7 + (-2) - 1) // -2) # -2, ошибка
print(-(-7 // -2)) # -3
print(math.ceil(7 / -2)) # -3
Пример: сколько страниц нужно для списка
Задача из жизни: 47 товаров, по 10 на странице. Страниц нужно 5, последняя заполнится не целиком.
def ceil_div(a, b):
return -(-a // b)
items = 47
per_page = 10
print(ceil_div(items, per_page)) # 5
Приём с двумя минусами удобно спрятать в функцию с понятным именем, как ceil_div выше. Строку ceil_div(items, per_page) коллега прочитает сразу, а над -(-items // per_page) задумается.
Как округлить в большую сторону без math
Иногда модуль math подключать не разрешают, например в учебной задаче. Тогда подойдёт один из двух вариантов.
-(-x // 1): тот же приём с двумя минусами и делителем 1. Для дробного x результат тоже будет дробным, 5.0 вместо 5, поэтому оберните его вint().int(x) + (x > int(x)): отбросить дробную часть и прибавить единицу, если она была. ЛогическоеTrueв сложении считается единицей, потому что в Python тип bool входит в целые числа.
x = 4.2
print(-(-x // 1)) # 5.0
print(int(-(-x // 1))) # 5
print(int(x) + (x > int(x))) # 5
x = -4.2
print(int(x) + (x > int(x))) # -4
Второй вариант правильно работает и с отрицательными числами. Функция int() отбрасывает дробную часть в сторону нуля, для −4,2 получается −4, условие ложно, и единица не прибавляется.
Как округлить вверх до двух знаков после запятой
У math.ceil() нет параметра для знаков после запятой. Первым в голову приходит простой ход: умножить на 100, округлить и поделить обратно. На части чисел так появляется лишняя копейка.
import math
print(1.1 * 100) # 110.00000000000001
print(math.ceil(1.1 * 100) / 100) # 1.11
Число 1,1 во float хранится как 1,1000000000000000888…, после умножения погрешность становится видна, и ceil округляет её вверх. Почему десятичные дроби в двоичной памяти неточны, объясняет раздел учебника Python про числа с плавающей точкой. Как вообще выглядят числа в двоичной записи, показано в разборе систем счисления в Python.
Решение: модуль decimal. Создайте число из строки и округлите методом quantize() с режимом ROUND_CEILING. В документации decimal этот режим описан как округление в сторону плюс бесконечности.
from decimal import Decimal, ROUND_CEILING
print(Decimal('1.1').quantize(Decimal('0.01'), rounding=ROUND_CEILING)) # 1.10
print(Decimal('1.101').quantize(Decimal('0.01'), rounding=ROUND_CEILING)) # 1.11
print(Decimal(1.1).quantize(Decimal('0.01'), rounding=ROUND_CEILING)) # 1.11
Кавычки в Decimal('1.1') обязательны. Без них Decimal(1.1) получит ту же неточность float и снова вернёт 1.11, это видно по третьей строке примера.
Как округлить вверх до десятков, сотен или кратного числа

Цены часто округляют до сотен, а количество упаковок до кратного пяти. Для этого число делят на шаг, округляют частное вверх и умножают обратно. В таблицах ту же задачу решает функция ОКРВВЕРХ, о ней есть отдельная инструкция по округлению в Excel.
def ceil_to(x, step):
return -(-x // step) * step
print(ceil_to(1234, 100)) # 1300
print(ceil_to(1200, 100)) # 1200
print(ceil_to(37, 5)) # 40
print(ceil_to(-1234, 100)) # -1200
Для целых снова подходит приём с двумя минусами, он не уходит во float. Вариант math.ceil(1234 / 100) * 100 даст те же 1300, но на больших числах повторит ошибку точности из раздела про деление.
Встроенная round() с отрицательным вторым аргументом здесь не поможет. round(1234, -2) вернёт 1200: функция ищет ближайшую сотню, а ближайшая к 1234 лежит ниже.
Отрицательные числа: вверх или от нуля
math.ceil() округляет в сторону плюс бесконечности. Для −2,5 это −2: число стало больше, хотя по модулю уменьшилось.
Если нужно округлять от нуля, чтобы и 2,5, и −2,5 росли по модулю, в decimal есть режим ROUND_UP. Сравнение всех вариантов на двух числах:
| Способ | 2.5 | −2.5 |
|---|---|---|
math.ceil(), ROUND_CEILING |
3 | −2 |
ROUND_UP (от нуля) |
3 | −3 |
math.floor() |
2 | −3 |
int(), math.trunc() |
2 | −2 |
from decimal import Decimal, ROUND_UP
print(Decimal('-2.5').quantize(Decimal('1'), rounding=ROUND_UP)) # -3
Округление вверх в NumPy
Для массивов есть np.ceil(), функция округляет каждый элемент. Массив дробных чисел она возвращает тоже дробным: 2.0 вместо 2, как в примере из справки NumPy.
import numpy as np
a = np.array([1.2, -1.2, 3.0])
print(np.ceil(a)) # [ 2. -1. 3.]
print(np.ceil(a).astype(int)) # [ 2 -1 3]
Если NumPy уже стоит в проекте для расчётов, например для суммы элементов списка, цикл с math.ceil() по массиву не нужен: np.ceil() обработает всё одной строкой.
Частые ошибки при округлении вверх

- round() вместо ceil. Функция round() округляет к ближайшему, а при равном расстоянии к чётному:
round(2.5)вернёт 2,round(3.5)вернёт 4. Так написано в описании встроенных функций. Вверх она не округляет. - int() вместо ceil.
int(2.9)вернёт 2: функция отбрасывает дробную часть. - Забыли импорт. Без строки
import mathвызов упадёт сNameError: name 'math' is not defined. - Строка вместо числа.
math.ceil('3.2')выдастTypeError: must be real number, not str. Значение изinput()сначала переводят в число, как это сделать с проверкой, показано в инструкции про ввод числа в Python. - Бесконечность и NaN.
math.ceil(float('inf'))вызывает OverflowError, а NaN даёт ValueError. Если такие значения бывают в данных, отсейте их черезmath.isfinite()до округления.
Где освоить Python системно
Округление вверх кажется мелочью, но на нём хорошо видно, как по-разному ведут себя int, float и Decimal. Чтобы разобраться в типах и стандартной библиотеке целиком, сравните курсы по программе, цене и отзывам выпускников.
Закрепить основы на практике помогут 30 задач по Python для начинающих с разбором.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 011 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 666 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Программирование на Python ПРО Перейти на сайт курса | 119 600 ₽ | - | 17 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




