Операция по модулю отрицательных чисел в Python

Я нашел странное поведение в Python относительно отрицательных чисел:

>>> -5 % 4
3

Кто-нибудь может объяснить, что происходит?

 wheaties07 окт. 2010 г., 17:04
смотрит прямо на меня
 NullUserException07 окт. 2010 г., 17:19
..., -9, -5, -1, 3, 7, ...
 nyuszika7h17 июл. 2014 г., 10:56
 Helio28 янв. 2017 г., 17:42
Ты можешь использоватьmath.fmod чтобы получить то же поведение, что и в C или Java.

Ответы на вопрос(6)

ельными числами. Было бы хорошо, еслиa/b была такой же величины и противоположным знаком(-a)/b, Было бы хорошо, еслиa % b был действительно по модулю б. Так как мы действительно хотимa == (a/b)*b + a%bПервые два несовместимы.

Какой из них оставить, это сложный вопрос, и у обеих сторон есть свои аргументы. С и С ++ округляют целочисленное деление до нуля (такa/b == -((-a)/b)), и, видимо, Python нет.

аргументированная исключение из конвенций других языков.

Это дает отрицательным числам плавное поведение, особенно при использовании в сочетании с// оператор целочисленного деления, как% по модулю часто есть (как в математике.divmod):

for n in range(-8,8):
    print n, n//4, n%4

Производит:

 -8 -2 0
 -7 -2 1
 -6 -2 2
 -5 -2 3

 -4 -1 0
 -3 -1 1
 -2 -1 2
 -1 -1 3

  0  0 0
  1  0 1
  2  0 2
  3  0 3

  4  1 0
  5  1 1
  6  1 2
  7  1 3
питон% всегда выводит ноль или положительный, когда делитель положительныйпитон// всегда округляется к отрицательной бесконечности
 Lamis16 окт. 2016 г., 08:51
Спасибо, твой пример заставил меня понять это :)
Решение Вопроса

%) всегда возвращайте число, имеющее тот же знак, что и знаменатель (делитель). Ваше выражение дает 3, потому что

(-5)% 4 = (-2 × 4 + 3)% 4 = 3.

Его выбирают из поведения C, потому что неотрицательный результат часто более полезен. Примером является вычисление дней недели. Если сегодня вторник (день № 2), то какой день недели?N дней раньше? В Python мы можем вычислить с

return (2 - N) % 7

но в С, еслиN ≥ 3, мы получаем отрицательное число, которое является недействительным числом, и нам нужно исправить это вручную, добавив 7:

int result = (2 - N) % 7;
return result < 0 ? result + 7 : result;

(Увидетьhttp://en.wikipedia.org/wiki/Modulo_operator как определяется знак результата для разных языков.)

 zezollo19 янв. 2018 г., 19:36
Удивительно, но оператор Python по модулю (%)не всегда вернуть число, имеющее тот же знак, что и знаменатель (делитель). Увидетьstackoverflow.com/questions/48347515/...

http://python-history.blogspot.com/2010/08/why-pythons-integer-division-floors.html

По сути, это так, что a / b = q с остатком r сохраняет отношения b * q + r = a и 0 <= r <b.

 Evgeni Sergeev22 апр. 2014 г., 09:43
Такие языки, как C ++ и Java, также сохраняют первые отношения, но они имеют отрицательное значениеaположительныйbтогда как полы Python. Это всегда правда, чтоabs(r) < bи они перекрываютr <= 0.

0: 0, 4, 8, 12 ... и -4, -8, -12 ...1: 1, 5, 9, 13 ... и -3, -7, -11 ...2: 2, 6, 10 ... и -2, -6, -10 ...3: 3, 7, 11 ... и -1, -5, -9 ...

Вот ссылка наПоведение по модулю с отрицательными числами, (Да, я гуглил это)

 wheaties07 окт. 2010 г., 17:35
@NullUserException - да, это было. фиксированный. Благодарю.

что это было странное поведение Python. Оказывается, я плохо решал деление (на бумаге); Я давал значение 0 для частного и значение -5 для остальных. Ужасно ... Я забыл геометрическое представление целых чисел. Вспоминая геометрию целых чисел, заданную числовой линией, можно получить правильные значения для частного и остатка и проверить, что поведение Python в порядке. (Хотя я предполагаю, что вы уже решили свою проблему давно).

Ваш ответ на вопрос