В Python 3 у деления три оператора. Обычное деление / всегда возвращает дробное число: 7 / 2 даст 3.5, а 6 / 3 даст 2.0, хотя числа делятся нацело. Целочисленное деление // отбрасывает дробную часть с округлением вниз, поэтому 7 // 2 равно 3. Остаток считает %: 7 % 2 равно 1.
Ниже разберём, почему -7 // 2 в питоне равно -4, как получить целую часть и остаток от деления одной функцией, что делать с ZeroDivisionError и где деление даёт неточный ответ. Остальные знаки языка собраны в шпаргалке по операторам Python, а здесь только деление.
Три оператора деления в Python

| Запись | Что делает | Пример | Результат |
|---|---|---|---|
/ |
обычное деление | 7 / 2 |
3.5 |
// |
целочисленное деление, округление вниз | 7 // 2 |
3 |
% |
остаток от деления | 7 % 2 |
1 |
divmod() |
частное и остаток одной парой | divmod(7, 2) |
(3, 1) |
Тип результата задаёт оператор, а не сами числа. В справочнике по языку это сформулировано так: «Деление целых чисел даёт float, а целочисленное деление целых чисел — целое число».
Обычное деление / всегда даёт float
Даже когда одно число делится на другое без остатка, оператор / возвращает тип float:
print(7 / 2)
print(6 / 3)
print(type(6 / 3))
3.5
2.0
<class 'float'>
Если нужно целое, делите через // или оберните результат в int(): int(6 / 3) вернёт 2. Как ведёт себя тип int и функция с тем же именем, подробно разобрано в статье про целые числа в Python.
Большие числа теряют точность
Целые числа в Python не ограничены по длине, а float ограничен. Поэтому деление через / на больших значениях может «потерять» последние цифры:
n = 10 ** 17 + 1
print(n / 1)
print(int(n / 1))
print(n // 1)
1e+17
100000000000000000
100000000000000001
Деление на единицу должно было вернуть то же число, но после / единица на конце пропала, и int() её уже не вернёт. С большими целыми (идентификаторы, суммы в копейках) делите через //, если вам нужен целый ответ.
Целочисленное деление // и отрицательные числа
Оператор // делит и округляет результат вниз, к меньшему целому. С положительными числами это выглядит как простое отбрасывание дробной части. С отрицательными результат многих удивляет:
print(7 // 2)
print(-7 // 2)
print(7 // -2)
print(int(-7 / 2))
3
-4
-4
-3
Математически -7 / 2 равно -3.5. Округление вниз даёт -4, потому что −4 меньше −3,5. А int() отбрасывает дробную часть в сторону нуля и возвращает -3.
Правило зафиксировано в документации по числовым типам: «The result is always rounded towards minus infinity», то есть результат всегда округляется в сторону минус бесконечности.
Если одно из чисел дробное
Оператор // работает и с float. Значение получается целым, но тип остаётся дробным. Чем int и float отличаются в памяти и при выводе, видно в таблице типов данных Python:
print(7.5 // 2)
print(7 // 2.0)
3.0
3.0
Как выбрать способ:
//подходит, когда нужен индекс, номер страницы или число целых коробок;int(a / b)илиmath.trunc(a / b)подходят, когда дробную часть нужно отбросить к нулю и для отрицательных чисел ответ −3, а не −4;- деление с округлением вверх записывают как
-(-a // b), этот приём есть в разборе округления в большую сторону.
Приоритет деления и сокращённая запись
Все операторы деления стоят в одной строке таблицы приоритетов вместе с умножением: *, /, // и % выполняются раньше сложения и вычитания. Операторы одного уровня, по справочнику, «группируются слева направо». На практике это значит, что выражение считается по порядку, пока скобки не скажут иначе:
print(8 / 2 * 4)
print(8 / (2 * 4))
print(2 + 10 // 3)
16.0
1.0
5
В первой строке Python сначала делит 8 на 2, потом умножает на 4. Хотели разделить на произведение — ставьте скобки. Унарный минус в той же таблице стоит выше, поэтому -7 // 2 читается как (-7) // 2.
Чтобы разделить переменную и сразу записать результат в неё же, есть короткая форма: x /= 2 вместо x = x / 2 и x //= 2 вместо x = x // 2. Правило типов остаётся прежним:
total = 10
total /= 4
print(total)
boxes = 10
boxes //= 4
print(boxes)
2.5
2
После /= в переменной total лежит уже float. Если дальше она идёт в range() или в индекс списка, программа упадёт с TypeError.
Целая часть и остаток одной строкой через divmod()

Когда нужны и частное, и остаток, вызывать // и % по очереди не обязательно. Функция divmod() вернёт оба числа сразу. Например, переведём 135 минут в часы и минуты:
minutes = 135
hours, rest = divmod(minutes, 60)
print(hours, rest)
2 15
В справочнике связь записана тождеством: divmod(x, y) == (x//y, x%y). Из него видно, откуда берётся остаток у отрицательных чисел. Раз -7 // 2 равно -4, то остаток равен -7 - (-4 * 2), то есть 1:
print(-7 % 2)
print(divmod(-17, 5))
1
(-4, 3)
Чётность, последняя цифра числа и остаток «как в C» вынесены в отдельную статью про остаток от деления.
Деление на ноль: ZeroDivisionError
Если делитель равен нулю, Python останавливает программу с исключением ZeroDivisionError. Это касается всех трёх операторов и функции divmod():
print(10 / 0)
Traceback (most recent call last):
File "main.py", line 1, in <module>
print(10 / 0)
~~~^~~
ZeroDivisionError: division by zero
Вывод снят в Python 3.14, путь к файлу сокращён. Когда делитель приходит от пользователя или из файла, проверьте его заранее через if b != 0 либо перехватите исключение:
def safe_div(a, b):
try:
return a / b
except ZeroDivisionError:
return None
print(safe_div(10, 4))
print(safe_div(10, 0))
2.5
None
Как устроены try и except и почему не стоит ловить все ошибки подряд, показано в статье про обработку исключений.
Когда деление в питоне выдаёт неточный ответ

Дробные числа хранятся в двоичном виде. В учебнике Python сказано, что «большинство десятичных дробей невозможно точно представить в виде двоичных дробей». Отсюда странные результаты:
print(0.3 / 0.1)
print(0.3 // 0.1)
2.9999999999999996
2.0
Хуже всего второй случай. Ожидали 3, получили 2, и по виду результата ошибку не заметить. Если нужна точная арифметика (деньги, дроби в задачах), берите модули fractions и decimal:
from fractions import Fraction
from decimal import Decimal
print(Fraction(3, 10) / Fraction(1, 10))
print(Decimal("0.3") // Decimal("0.1"))
print(Fraction(1, 3) + Fraction(1, 6))
3
3
1/2
Decimal создавайте из строки, а не из float: Decimal(0.1) унаследует ту же двоичную погрешность.
Как оставить два знака после запятой
Чтобы показать результат деления аккуратно, округлите его через round() или отформатируйте в f-строке:
x = 7 / 3
print(x)
print(round(x, 2))
print(f"{x:.2f}")
2.3333333333333335
2.33
2.33
round() меняет само число, а f-строка только запись при выводе. Другие форматы чисел есть в разборе f-строк.
Как разделить каждый элемент списка на число
Оператор / между списком и числом не работает. Пройдите по элементам генератором списка:
prices = [100, 250, 999]
print([p / 2 for p in prices])
print([p // 2 for p in prices])
[50.0, 125.0, 499.5]
[50, 125, 499]
Первая строка вернёт дробные значения, вторая только целые. Так же делят столбец чисел, прочитанный из файла.
Почему в старых примерах 5 / 2 равно 2
В Python 2 оператор / для двух целых чисел возвращал целую часть. В PEP 238 это поведение названо неоднозначным: для целых аргументов оператор «returns the floor of the mathematical result», а для дробных возвращает обычное частное.
В Python 3 классическое деление убрали, и 5 / 2 теперь всегда 2.5. Если встретили код, который рассчитывает на старое поведение, замените / на //.
Частые ошибки при делении
| Что видите | Причина | Что сделать |
|---|---|---|
TypeError: unsupported operand type(s) for /: 'str' and 'int' |
число пришло из input() строкой |
преобразовать: int(input()) или float(input()) |
TypeError: 'float' object cannot be interpreted as an integer |
в range() передали n / 2 |
писать range(n // 2) |
TypeError: list indices must be integers or slices, not float |
индекс посчитали через / |
делить через // |
-7 // 2 даёт -4 |
// округляет вниз |
для отбрасывания к нулю взять int(a / b) |
0.3 // 0.1 даёт 2.0 |
погрешность float |
считать в Decimal или Fraction |
Первая ошибка возникает потому, что input() всегда возвращает строку. Как правильно прочитать число с клавиатуры и не упасть на пустом вводе, мы показали в статье про int(input()).
Вторая и третья ошибки решаются одинаково. Вот как взять средний элемент списка:
items = [10, 20, 30, 40, 50]
print(items[len(items) // 2])
30
Где освоить Python системно
Деление легко запомнить по таблице, но уверенность приходит на задачах, где //, % и divmod() встречаются вперемешку с циклами и списками. Для тренировки подойдут 30 задач по Python для начинающих. Если хотите пройти язык с наставником и проверкой домашних заданий, сравните программы в каталоге курсов Python:
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Профессия «Python-разработчик» Перейти на сайт курса | 157 335 ₽ | 5987 ₽/мес. | 10 месяцев | Обзор курса | |
| Fullstack-разработчик на Python Перейти на сайт курса | 137 000 ₽ | 7125 ₽/мес. | 21 месяц | Обзор курса | |
| ДО Профессия Python-разработчик Перейти на сайт курса | 149 001 ₽ | 3167 ₽/мес. | 10 месяцев | Обзор курса | |
| Автоматизированное тестирование на Python Перейти на сайт курса | 118 754 ₽ | 4108 ₽/мес. | 9 месяцев | Обзор курса | |
| Профессия Python-разработчик Перейти на сайт курса | 140 040 ₽ | 3890 ₽/мес. | 10 месяцев | Обзор курса |
Больше программ — в полном каталоге курсов по Python




