Вопрос-Ответ

How does the modulo (%) operator work on negative numbers in Python?

Как оператор modulo (%) работает с отрицательными числами в Python?

Как именно работает оператор % в Python, особенно когда задействованы отрицательные числа?

Например, почему -5 % 4 вычисляется в 3, а не, скажем, -1?

Переведено автоматически
Ответ 1

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


(-5) / 4 = -1.25 --> floor(-1.25) = -2


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


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

return (2 - N) % 7

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

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

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

Ответ 2

Вот объяснение от Гвидо ван Россума:

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

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

Ответ 3

В python оператор modulo работает следующим образом.

>>> mod = n - math.floor(n/base) * base

итак, результат (для вашего случая):

mod = -5 - floor(-1.25) * 4
mod = -5 - (-2*4)
mod = 3

в то время как другие языки, такие как C, JAVA, JavaScript, используют усечение вместо floor.

>>> mod = n - int(n/base) * base

что приводит к:

mod = -5 - int(-1.25) * 4
mod = -5 - (-1*4)
mod = -1

If you need more information about rounding in python, read this.

Ответ 4

Other answers, especially the selected one have clearly answered this question quite well. But I would like to present a graphical approach that might be easier to understand as well, along with python code to perform normal mathematical modulo in python.

Python Modulo for Dummies

Modulo function is a directional function that describes how much we have to move further or behind after the mathematical jumps that we take during division over our X-axis of infinite numbers.
So let's say you were doing 7%3

enter image description here

So in forward direction, your answer would be +1, but in backward direction-

enter image description here

your answer would be -2. Both of which are correct mathematically.

Similarly, you would have 2 moduli for negative numbers as well. For eg: -7%3, can result both in -1 or +2 as shown -

enter image description here

Forward direction


enter image description here

Backward direction


In mathematics, we choose inward jumps, i.e. forward direction for a positive number and backward direction for negative numbers.

But in Python, we have a forward direction for all positive modulo operations. Hence, your confusion -

>>> -5 % 4 
3

>>> 5 % 4
1

Here is the python code for inward jump type modulo in python:

def newMod(a,b):
res = a%b
return res if not res else res-b if a<0 else res

which would give -

>>> newMod(-5,4)
-1

>>> newMod(5,4)
1

Many people would oppose the inward jump method, but my personal opinion is, that this one is better!!

python