2014-09-08 1 views
6

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

 
-5 % 4 

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

+0

5 по модулю 4 дает остаток 1, -5 моды 4 дает -1. Имеет смысл для меня – Huangism

+0

Интересно, что [wolfram alpha] (http://www.wolframalpha.com/input/?i=-5%254) согласен с вами, но я думаю, что большинство языков программирования вернут '-1'. '.NET' возвращает' -1'. –

+0

Посмотрите документ MSDN: http://msdn.microsoft.com/en-us/library/ie/9f59bza0%28v=vs.94%29.aspx. «Знак результата совпадает с знаком числа 1. Значение результата находится между 0 и абсолютным значением number2." –

ответ

6

Потому что это remainder operator, а не по модулю. Но есть proposal for a proper one.

Цитата из Ecma 5.1

остаток г от дивидендов п и делителем д определяется математическое соотношение г = п - (г × д) где д является целым числом, является отрицательным, только если п/д является отрицательным и положительным только тогда, когда п/д положительна

1

причина заключается в том, что % не модуль но Остаток Оператор. See here

-1

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

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

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

в JavaScript, который принимает знак divident:

-5 % 4 == -1 # -5 = (-1) * 4 - 1 
0

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

0

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

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

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

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

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