Модульная арифметика Javascript

Javascript оценивает следующий фрагмент кода как -1.

-5 % 4

Я понимаю, что теорема об остатках утверждает, что a = bq + r такое, что 0 r ‹ b. Учитывая приведенное выше определение, не должен ли ответ быть 3? Почему JavaScript возвращает -1?


person walkerrandophsmith    schedule 08.09.2014    source источник
comment
5 по модулю 4 дает остаток 1, -5 по модулю 4 дает -1. Имеет смысл для меня   -  person Huangism    schedule 08.09.2014
comment
Интересно, что wolfram alpha с вами согласен, но я думаю, что большинство языков программирования вернет -1. .NET возвращает -1.   -  person Matt Burland    schedule 08.09.2014
comment
Посмотрите документ MSDN: msdn.microsoft .com/en-us/library/ie/9f59bza0%28v=vs.94%29.aspx. Знак результата такой же, как и у числа 1. Значение результата находится между 0 и абсолютным значением числа2.   -  person Samuel Caillerie    schedule 08.09.2014
comment
Разница может быть между (-5)%4 и -(5%4). Другими словами, это зависит от приоритета % по сравнению с -. Изменить: на самом деле похоже, что - должен иметь более высокий приоритет, чем % (4 против 5)   -  person Matt Burland    schedule 08.09.2014


Ответы (5)


Потому что это оператор остатка, а не по модулю. Но есть предложение по правильному.

Цитата из Ecma 5.1

остаток r от делимого n и делителя d определяется математическим соотношением r = n − (d × q), где q — целое число, отрицательное, только если n/d отрицательно, и положительное, только если n/d положительно

person nullpotent    schedule 08.09.2014

Большинство языков программирования используют симметричный модуль, который отличается от математического для отрицательных значений.

Математический модуль можно вычислить, используя симметричный модуль следующим образом:

a mod b = ((a % b) + b) % b

mod по математическому модулю

% симметричный по модулю

person niklassc    schedule 17.11.2017
comment
Я догадался, но не был уверен, правильно это или нет. Ваш ответ спас меня. - person Dulguun Otgon; 01.05.2020

Причина в том, что % — это не модуль, а оператор остатка. см. здесь

person FK82    schedule 08.09.2014

... если остаток отличен от нуля, есть два возможных варианта остатка: один отрицательный, а другой положительный, а также два возможных варианта для частного. Обычно в теории чисел всегда выбирается положительный остаток, но языки программирования выбирают в зависимости от языка и знаков a и n. (http://en.wikipedia.org/wiki/Modulo_operation)

в питоне, который принимает знак делителя:

   -5 % 4 ==  3   # -5 = (-2) * 4 + 3

в javascript, который принимает знак делителя:

   -5 % 4 ==  -1   # -5 = (-1) * 4 - 1
person georg    schedule 08.09.2014

Если вы используете % для модульной арифметики, не имеет значения (по крайней мере, концептуально), будет ли -5 % 4 оцениваться как -1 или 3, потому что эти два числа конгруэнтны по модулю 4: для целей модульной арифметики они одинаковый.

person Vectornaut    schedule 24.04.2015