Поведение % и // в Python для отрицательных чисел

Поведение % и // в Python для отрицательных чисел

@python_quiz

Разберем этот квиз

Кратко: что делает этот код и почему он выводит именно такие значения.

python

Результат выполнения — числа 2 и -7, то есть вывод: 2 -7.

Объяснение по шагам

  1. Операция остатка (a % b) в Python гарантирует, что при положительном делителе b остаток неотрицателен:

-7 % 3 == 2
Это потому, что Python реализует остаток так, чтобы выполнялось неравенство 0 <= a % b < |b| при b > 0.

  1. Операция целочисленного деления // — это не отбрасывание дробной части (не «сокращение к нулю»), а округление вниз (floor):

-7 // 3 == -3
Здесь -7/3 ≈ -2.333..., округление вниз даёт -3.

  1. Сохраняется фундаментальная тождественность:

a == (a // b) * b + (a % b)
Для a = -7 и b = 3:
(-7 // 3) * 3 + ( -7 % 3 ) == -3 * 3 + 2 == -9 + 2 == -7

Поэтому в выводе первый элемент — остаток (2), а второй — восстановленное число (-7).

Разбор вариантов (коротко)

  • Варианты с остатком -1 ошибочны, потому что при положительном делителе 3 остаток не может быть отрицательным. В Python -7 % 3 не равно -1.
  • Вариант с выводом "-1 -1" неверен ещё и потому, что тождество a == (a//b)*b + (a%b) должно выполняться, а -1 + (-1) = -2 ≠ -7.
  • Вариант, где указано "2 -7" — соответствует фактическому поведению. Объяснение «% берёт знак делителя, а не делимого» формулирует суть: знак остатка совпадает со знаком делителя (при положительном делителе остаток неотрицателен). Более точно, при b > 0 остаток лежит в интервале [0, b).

Наглядная демонстрация дополнительных примеров

python

Ожидаемые результаты показывают, как меняются // и % при разных знаках аргументов. Важно помнить правило про floor-деление и интерпретацию знака остатка в зависимости от знака делителя.

Вывод

При работе с отрицательными делимыми в Python:

  • // — округление вниз (floor);
  • % — остаток с тем же знаком, что и делитель; при положительном делителе остаток неотрицателен;
  • выполняется тождество a == (a // b) * b + (a % b).

Это объясняет, почему приведённый код печатает "2 -7".

Report Page