Целочисленного деления и деления с отрицательными операндами в 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