Глава 5 · Давайте поиграем с числами!

Отрицательное floor-деление

Самая частая неожиданность в этой теме — что делает // с отрицательными числами. Разбираемся на числовой прямой.

Что будет, если разделить с остатком отрицательное число? Здесь Python ведёт себя иначе, чем многие ожидают из школы — и это важно понять сейчас, а не в момент отладки.

Округление всегда вниз — то есть к минус бесконечности

// в Python называется floor division — «деление с округлением к полу» (floor). Пол — это округление в сторону меньшего числа, и для отрицательных чисел «меньшее» означает «более отрицательное»:

-6-5-4-3-2-101-4
-7 // 2 = -4 — округление к полу означает движение ВЛЕВО по числовой прямой, к −∞
otricatelnoe_floor.py
print(-7 // 2)    # -4, а не -3! Python округляет к минус бесконечности
print(7 // 2)     # 3 — для положительных чисел разницы с округлением 'к нулю' нет
print(-7 / 2)     # -3.5 — обычное деление честно показывает дробную часть
Не 'округление к нулю', как в некоторых языках
В части других языков программирования -7 // 2 дало бы -3 (округление к нулю). В Python результат — -4: это осознанный выбор языка, чтобы формула ниже работала всегда, без исключений для отрицательных чисел.

Остаток при отрицательном делении

Знак остатка в Python всегда совпадает со знаком делителя:

otricatelnyj_ostatok.py
print(-7 % 2)     # 1 — остаток положителен, потому что делитель (2) положителен
print(7 % -2)     # -1 — остаток отрицателен, потому что делитель (-2) отрицателен

Тождество, которое работает всегда

Как бы ни менялись знаки, для любых a и b (кроме деления на 0) верно:

a == (a // b) * b + a % b
-7 == (-7 // 2) * 2 + (-7 % 2)
-7 == (-4) * 2 + 1
-7 == -8 + 1
-7 == -7 ✓
Тождество деления с остатком проверено на примере -7 и 2
tozhdestvo.py
a, b = -7, 2
print((a // b) * b + a % b == a)   # True — тождество работает всегда
Практика: отрицательное floor-деление
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →