2016-11-19 5 views
0

Согласно Wikipedia, modulo operator (остаток целочисленного деления) на n должен давать результат между 0 и n-1.Javascript modulo operator ведет себя иначе, чем другие языки

Это действительно так в python:

print(-1%5) # outputs 4 

В Ruby:

puts -1%5 # outputs 4 

В Haskell

main = putStrLn $ show $ mod (-1) 5 

Но в Javascript:

console.log(-1%5); 

Результат: -1 !!

Почему? есть ли логика этого дизайнерского решения?

В то время как -1 эквивалентно 4 по модулю 5, отрицательные значения затрудняют использование в качестве показателей.

Например:

arr[x%5] 

всегда будет допустимым выражением в python и Ruby, когда длина массива больше, чем 5, но в Javascript, это исключение для того чтобы случиться.

+0

Вы ссылаетесь на Википедию, но в ней четко указано: «Если либо a, либо n отрицательно, наивное определение ломается, а языки программирования различаются в зависимости от того, как определяются эти значения». Так что это не значит, что языки прогамминга нарушают его, поскольку вы тоже претензии. – vlaz

+0

Очевидно, что это так, вопрос в том, почему? –

+0

Также я не вижу, как 'arr [x% 5]' является 'исключением, ожидающим, чтобы произойти' в JS - если вы передадите отрицательное число, вы получите отрицательный результат, так что вы получите' undefined' , Если бы оператор действительно работал как python или что-то еще, тогда он даст вам элемент _random_ из массива. Таким образом, у вас может быть ошибка и никогда не найти ее до конца позже, потому что она _seems_ нравится, как работает. – vlaz

ответ

2

Если «модуль» вы понимаете, что остальная часть евклидова деления является общей в математике, то % operator не является оператором modulo. Это скорее называется оператором остатка , результат которого всегда имеет тот же знак, что и дивиденд. (В Haskell это делает rem function).

Это поведение довольно распространено среди языков программирования, особенно на C и Java, из которых были разработаны арифметические условные обозначения JavaScript.

Смежные вопросы