Деление в питоне: как работают операторы / и // с примерами

В Python 3 оператор / всегда возвращает дробное число, // делит нацело с округлением вниз, а % даёт остаток.

Разбираем на примерах с выводом, почему -7 // 2 равно -4, как получить частное и остаток через divmod(), что делать с ZeroDivisionError и почему 0.3 // 0.1 равно 2.0.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3233 статьи автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3887 экспертных мнений Подписаться на Телеграм-канал
Обложка: Деление в питоне: как работают операторы / и // с примерами

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

Ниже разберём, почему -7 // 2 в питоне равно -4, как получить целую часть и остаток от деления одной функцией, что делать с ZeroDivisionError и где деление даёт неточный ответ. Остальные знаки языка собраны в шпаргалке по операторам Python, а здесь только деление.

CheckroiCheckroiПодборка курсов по Python570 курсов • 53 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Три оператора деления в 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() её уже не вернёт. С большими целыми (идентификаторы, суммы в копейках) делите через //, если вам нужен целый ответ.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Целочисленное деление // и отрицательные числа

Оператор // делит и округляет результат вниз, к меньшему целому. С положительными числами это выглядит как простое отбрасывание дробной части. С отрицательными результат многих удивляет:

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 и почему не стоит ловить все ошибки подряд, показано в статье про обработку исключений.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Когда деление в питоне выдаёт неточный ответ

Стол программиста с ноутбуком, весами и разрезанной на доли пиццей-диаграммой

Дробные числа хранятся в двоичном виде. В учебнике 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. Если встретили код, который рассчитывает на старое поведение, замените / на //.

CheckroiCheckroiПодборка курсов для Python-разработчиков85 курсов • 33 школыСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Частые ошибки при делении

Что видите Причина Что сделать
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-разработчик»
Перейти на сайт курса
SkillboxSkillbox157 335 ₽5987 ₽/мес.10 месяцевОбзор курса
Fullstack-разработчик на Python
Перейти на сайт курса
НетологияНетология137 000 ₽7125 ₽/мес.21 месяцОбзор курса
ДО Профессия Python-разработчик
Перейти на сайт курса
GeekBrainsGeekBrains149 001 ₽3167 ₽/мес.10 месяцевОбзор курса
Автоматизированное тестирование на Python
Перейти на сайт курса
SkillboxSkillbox118 754 ₽4108 ₽/мес.9 месяцевОбзор курса
Профессия Python-разработчик
Перейти на сайт курса
SkillFactorySkillFactory140 040 ₽3890 ₽/мес.10 месяцевОбзор курса

Больше программ — в полном каталоге курсов по Python

Часто задаваемые вопросы

Как сделать деление без остатка в питоне?

Используйте оператор //: 17 // 5 вернёт 3. Если нужны и частное, и остаток, вызовите divmod(17, 5), функция вернёт пару (3, 2).

Почему 6 / 3 в Python равно 2.0, а не 2?

В Python 3 оператор / всегда возвращает float, даже когда числа делятся нацело. Целое число даст 6 // 3 или int(6 / 3).

Что значит // в Python?

Это целочисленное деление: Python делит числа и округляет результат вниз, к меньшему целому. Поэтому 7 // 2 равно 3, а -7 // 2 равно -4.

Как получить целую часть от деления отрицательного числа без округления вниз?

Разделите через / и отбросьте дробную часть функцией int() или math.trunc(): int(-7 / 2) вернёт -3, а -7 // 2 вернёт -4.

Как избежать ошибки ZeroDivisionError?

Делить на ноль Python не умеет ни одним оператором. Проверьте делитель заранее через if b != 0 или перехватите исключение в блоке try и except ZeroDivisionError.

Как оставить два знака после запятой при делении?

Округлите результат функцией round(x, 2) или отформатируйте при выводе: f"{x:.2f}". Для 7 / 3 оба способа дадут 2.33.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!