Почему в Python при целочисленном делении (-1 // 2) получается ответ (-1)?

Добрый вечер. В Python при целочисленном делении, где делимое отрицательно и меньше по модулю делителя (например, -1 // 2), получается ответ -1. Но если делимое положительно и меньше делителя, то в ответе 0 (например, 1 // 2). Разве -1 // 2 не равно -(1 // 2)?

Более того, при обычном делении, где делимое отрицательно и меньше по модулю делителя (например, -1 / 2), целая часть частного равна нулю. Но разве int(-1 / 2) не равно -1 // 2?

Как это вообще работает? Насколько я знаю, в других ЯП та же ситуация.
  • Вопрос задан
  • 2853 просмотра
Решения вопроса 2
aRegius
@aRegius
Python Enthusiast
Добрый вечер.

Просто запомните, что оператор // производит деление, округляя результат до ближайшего меньшего целого значения. Вот и все.

-1 / 2 = - 0.5. Ближайшее меньшее целое значение: -1.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Соответствующий кусок статьи Википедии «Деление с остатком» во многом мой, расскажу вкратце.

Когда делитель отрицательный, в моей практике такого не бывало. А когда отрицательное делимое, есть два подхода. Но прежде выясним, что такое неполное частное и что такое остаток.
q = [a / b], r = a − bq.
Когда b>0, есть два подхода к округлению.
1. Неполное частное округляется к нулю, остаток отрицательный.
2. Неполное частное округляется к −∞, остаток положительный.
Оба имеют право на жизнь: первый — когда преобразуем сумму в копейках в рубли-копейки, второй — когда огрубляем координаты, чтобы указать, в какой клетке находится точка.
Можно эти правила расширить и на отрицательный делитель: a mod (−b) = −a mod b. В такой ситуации знак остатка равняется знаку делимого и делителя соответственно.
В x86 (а значит, в большинстве ЯП) принят первый подход. А в Питоне — второй.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@1001001
Чему равен остаток от деления -1 на 2?
условно если у вас a делится на b, то должны быть с1 - результатом целочисленного деления и с2 остатком и все это должно соответствовать a = c1*b + c2, вот вам и и -1

азве -1 // 2 не равно -(1 // 2)? Нет, приоритет операций
Ответ написан
Комментировать
А как прописать чтобы результат 1//2 был равен единицы, мне нужно чтобы и -1//2 и 1//2 давали 1?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы