pythonmodulonegative-number

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


Exactly how does the % operator work in Python, particularly when negative numbers are involved?

For example, why does -5 % 4 evaluate to 3, rather than, say, -1?


Solution

  • Unlike C or C++, Python's modulo operator (%) always return a number having the same sign as the denominator (divisor). Your expression yields 3 because

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

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

    It is chosen over the C behavior because a nonnegative result is often more useful. An example is to compute week days. If today is Tuesday (day #2), what is the week day N days before? In Python we can compute with

    return (2 - N) % 7
    

    but in C, if N ≥ 3, we get a negative number which is an invalid number, and we need to manually fix it up by adding 7:

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

    (See http://en.wikipedia.org/wiki/Modulo_operator for how the sign of result is determined for different languages.)