Integer division & modulo operation with negative operands in Python

后端 未结 4 539
时光说笑
时光说笑 2020-11-27 07:13

Questions arise when I type in these expressions to Python 3.3.0

-10 // 3  # -4
-10 % 3   #  2
10 // -3  # -4
10 % -3   # -2
-10 // -3 #  3

相关标签:
4条回答
  • 2020-11-27 07:48

    The integer division there is just taking the floor of the number obtained at the end.

    10/3  -> floor(3.33)  ->  3
    -10/3 -> floor(-3.33) -> -4
    

    (Why it floors)


    The modulo operation on the other hand is following the mathematical definition.

    0 讨论(0)
  • 2020-11-27 07:49
    • Magic formula: a = (a // b) * b + (a % b)
    • a: -10
    • b: 3
    • a // b: -4
    • a % b: 2

      Substitute in magic formula: -10 = -4 * 3 + 2 = -12 + 2 = -10

    • a: 10

    • b: -3
    • a // b: -4
    • a % b: -2

      In magic formula: 10 = -4 * -3 - 2 = 12 - 2 = 10

    So the magic formula seems to be correct.

    If you define a // b as floor(a / b) (which it is), a % b should be a - floor(a / b) * b. Let's see:

    • a: -10
    • b: 3
    • a % b = a - floor(a / b) * b = -10 - floor(-3.33) * 3 = -10 + 4 * 3 = 2

     

    The fact that a // b is always floored is pretty easy to remember (please read Cthulhu's first link, it's an explanation by the creator of Python). For negative a in a % b.. try to imagine a table of numbers that starts at 0 and has b columns:

    b = 3:
    
    0  1  2
    3  4  5
    6  7  8
    9 10 11
    ...
    

    If a is the number in a cell, a % b would be the column number:

    a         a % b
    _______________
    0  1  2   0 1 2
    3  4  5   0 1 2
    6  7  8   0 1 2
    9 10 11   0 1 2
    

    Now extend the table back in the negatives:

       a          a % b
     __________________
    -12 -11 -10   0 1 2
     -9  -8  -7   0 1 2
     -6  -5  -4   0 1 2
     -3  -2  -1   0 1 2
      0   1   2   0 1 2
      3   4   5   0 1 2
      6   7   8   0 1 2
      9  10  11   0 1 2
    

    -10 % 3 would be 2. Negative a in a % b would come up in these sorts of context. a % b with negative b doesn't come up much.

    0 讨论(0)
  • 2020-11-27 07:54

    A simple rule: for a % b = c, if c is not zero, then should have the same sign as b.

    And apply the magic formula:

    10 % -3 = -2 => 10 // -3 = (10 - (-2)) / (-3) = -4

    -10 % 3 = 2 => -10 // 3 = (-10 - 2) / 3 = -4

    -10 % -3 = -1 => -10 // -3 = (-10 - (-1)) / (-3) = 3

    0 讨论(0)
  • 2020-11-27 08:10

    OK, so I did some digging and I think that the problem isn't Python, but rather the Modulo function. I'm basing this answer off of http://mathforum.org/library/drmath/view/52343.html

    10 % 3 Uses the highest multiple of 3 that is LESS THAN 10. In this case, 9. 10 - 9 = 1

    -10 % 3 does the same thing. It's still looking for a multiple of 3 that is LESS THAN -10. In this case, -12. (-10) - (-12) = 2

    0 讨论(0)
提交回复
热议问题