Глава 5 · Давайте поиграем с числами!
Отрицательное floor-деление
Самая частая неожиданность в этой теме — что делает // с отрицательными числами. Разбираемся на числовой прямой.
Что будет, если разделить с остатком отрицательное число? Здесь Python ведёт себя иначе, чем многие ожидают из школы — и это важно понять сейчас, а не в момент отладки.
Округление всегда вниз — то есть к минус бесконечности
// в Python называется floor division — «деление с
округлением к полу» (floor). Пол — это округление в сторону меньшего числа,
и для отрицательных чисел «меньшее» означает «более отрицательное»:
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 ✓
tozhdestvo.py
a, b = -7, 2
print((a // b) * b + a % b == a) # True — тождество работает всегда
Практика: отрицательное floor-деление
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки