модуль отрицательных чисел в Python

23 % -5 = -2
23 % 5 = 3

Может кто-нибудь объяснить мне, как я могу это понять, потому что у меня завтра экзамен. Я хочу сказать, потому что -5 * -5 =25, а затем 25 -2 = 23, вот как они получают 23. Это правильно?


person anon_nerd    schedule 28.09.2012    source источник
comment
Это относится не столько к Python, сколько к математике в целом. mathforum.org/library/drmath/view/52343.html   -  person Waleed Khan    schedule 28.09.2012
comment
@WaleedKhan, ответ будет разным для разных языков, так что это во многом это вопрос о Python.   -  person Mark Ransom    schedule 28.09.2012
comment
Вы можете использовать math.fmod, чтобы получить то же поведение, что и в C или Java.   -  person 0x2b3bfa0    schedule 28.01.2017


Ответы (4)


В Python знак остатка совпадает со знаком знаменателя (что отличается от таких языков, как C, где он совпадает со знаком числителя). ).

Математически всегда гарантируется, что если a, b = divmod(n, d), то a*d + b == n.

Обратите внимание, что 23//5 == 4 и 23//-5 == -5 (Python всегда выполняет деление на пол). Таким образом, у нас есть 4*5 + 3 == 23 и -5*-5 - 2 == 23, как вы сказали.

person nneonneo    schedule 28.09.2012
comment
Гвидо объясняет это более подробно в этом сообщении блога: Почему полы целочисленного деления Python. - person Lukas Graf; 28.09.2012

Запишем это как N=kM+R.

У нас есть 23 = -5*(-5) - 2 и 23 = 4*5 + 3.

person OneThreeSeven    schedule 28.09.2012

Итак, 23% 5 = 3, так как 4*5 = 20, и когда вы разделите 23 на 20, вы получите остаток 3. Вы можете думать об этом как о шкафе, который вы можете пройти, не перебирая.

Что касается 23 % -5, то этот ответ отличается от одного языка программирования к другому.

Для Python это -2, потому что он всегда будет возвращать значение делителя, и это потому, что 5 * 5 = 25, и когда вы делите 23 на 25 в Python, вы получаете остаток -2 (поскольку он должен быть отрицательным, потому что делитель был отрицательным ), то есть 25 - 2 = 23.

Стоит отметить, что формальное математическое определение гласит, что b — положительное целое число.

person Derek W    schedule 28.09.2012
comment
Вообще-то, нет. Формальное математическое определение гласит, что некоторые числа эквивалентны по модулю. Классы эквивалентности обычно считаются [0], ... [n-1], но это не обязательно. [42] и [-99] - совершенно хорошие классы эквивалентности по модулю 2. - person nneonneo; 28.09.2012
comment
Я думаю, вы неправильно поняли, что я сказал. В форме a(mod b) a может быть любым целым числом. Следовательно, [2] сравнимо с [-3] по модулю 5. Именно b должно быть положительным целым числом в формальном математическом определении. Статья о модульной арифметике - person Derek W; 28.09.2012
comment
Ах. Вы так и не определили b, поэтому я сделал предположение. - person nneonneo; 28.09.2012

% в Python использует «операцию по модулю»; это отличается от получения напоминания об операции деления таким образом, что.

a - int(a/n) * n

хотя иногда он эквивалентен в некоторых компьютерных языках.

Математическое выражение можно найти здесь: http://en.wikipedia.org/wiki/Modulo_operation

Итак, очевидно, что в Python операция "%" использует следующее выражение:

mod(a, n) = a - n * floor(a / n)

Следовательно,

23%-5 = mod(23,-5) = 23-(-5) * пол(23/-5) = 23-(-5) *-5 = -2

а также

23%5 = мод(23, 5) = 23 - 5 * этаж (23/5) = 23 - 5 * 4 = 3

Кроме того, вы находите интересным, что

-23%5 = мод(-23,5) = (-23) - 5 * этаж (-23/5) = -23 - 5 * (-5) = 2

так как действие floor() будет принимать целочисленное значение к отрицательной бесконечности.

person Y. Chang    schedule 21.10.2013