Почему CoffeeScript использует %% для modulo вместо стандартного javascript-оператора%
В документации CoffeeScript для операторов говорится, что вы можете использовать %%
для истинного математического модуля, но нет объяснений, почему это отличается от "modulo operator" %
в JavaScript.
Далее в нем говорится, что a %% b
в CoffeeScript эквивалентен написанию (a % b + b) % b
в JavaScript, но это, похоже, дает те же результаты для большинства простых случаев.
Ответы
Ответ 1
Я нашел ответ в другом вопросе StackOverflow и ответил Javascript modulo не вел и Я хотел поделиться им для людей, которые любят меня, искали только объяснения, связанные с "CoffeeScript", и поэтому вам трудно найти правильный ответ.
Причиной использования a %% b
, который компилируется в (a % b + b) % b
, является то, что для отрицательного числа, например -5 % 3
, JavaScript произведет отрицательное число -5 % 3 = -2
, тогда как правильный математический ответ должен быть -5 % 3 = 1
.
Принятый ответ относится к статье об ошибке JavaScript по модулю, которая объясняет это хорошо.
Ответ 2
Сначала не было смысла для меня, поэтому я считаю, что ему нужен пример
check = (a,b) ->
c = (b*Math.floor(a/b)) + a%b
d = (b*Math.floor(a/b)) + a%%b
console.log(
[c, c == a]
[d, d == a]
)
check 78, 33 # [ 78, true ] [ 78, true ]
check -78, 33 # [ -111, false ] [ -78, true ]
###
78 mod 33 = 12
-78 mod 33 = 21
check: 78 = 33 * 2 + 12
check: -78 = 33 * -3 + 21
###
Похоже, что modulo - это математический трюк, позволяющий использовать одну формулу для всех чисел вместо одной для негативов, а второй для положительных. Не знаю, если это больше, чем просто трюк и имеет какое-то внутреннее значение.