Целочисленного деления и деления с отрицательными операндами в Python

вопросы возникают при вводе этих выражений в Python 3.3.0

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

похоже, что он принимает приблизительную плавающую точку (-3.33)? и округляет в любом случае в целочисленном делении, но в операции по модулю он делает что-то совершенно другое. Похоже, он возвращает остаток + / -1 и переключает знак только в зависимости от того, где находится отрицательный операнд. Я совершенно запутался, даже после прочтения других ответов на этом сайте! Надеюсь, кто-то сможет. четко объясните это тоже мне! В книге говорится: "вспомните эту волшебную формулу a = (a//b) (b)+(a%b), но это, похоже, не очищает воду для меня вообще.

-спасибо заранее!

Edit: это всего лишь мои личные оценки того, что происходит (выше), я знаю, я полностью!

4 ответов


целочисленное деление там просто принимает пол числа, полученного в конце.

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

(почему это пол)


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


  • волшебная формула: a = (a // b) * b + (a % b)
  • a: -10
  • b: 3
  • a // b: -4
  • a % b: 2

    заменить в волшебной формуле:-10 = -4 * 3 + 2 = -12 + 2 = -10

  • a: 10

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

    в магическую формулу: 10 = -4 * -3 - 2 = 12 - 2 = 10

таким образом, волшебная формула, кажется, правильный.

если вы определите a // b as floor(a / b) (что и есть), a % b должно быть a - floor(a / b) * b. Посмотрим:

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

тот факт, что a // b всегда floored довольно легко запомнить (пожалуйста, прочитайте первую ссылку Ктулху, это объяснение создателя Python). Для отрицательных a на a % b.. попробуйте представить таблицу чисел, которая начинается at 0 и b столбцы:

b = 3:

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

если a это номер в ячейке,a % b будет номером столбца:

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

теперь расширьте таблицу обратно в негативы:

   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 будет 2. Отрицательный a на a % b возникло бы в таком контексте. a % b отрицательный b не много.


простое правило: на a % b = c, Если c Не равно нулю, тогда должен иметь тот же знак, что и b.

и применить магическую формулу:

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


хорошо, поэтому я немного покопался, и я думаю, что проблема не в Python, а в функции по модулю. Я основываю этот ответ на http://mathforum.org/library/drmath/view/52343.html

10 % 3 использует наибольшее кратное 3, которое меньше 10. В данном случае 9. 10 - 9 = 1

-10 % 3 делает то же самое. Он все еще ищет кратное 3, которое меньше -10. В этом случае, -12. (-10) - (-12) = 2