Подтвердить что ты не робот

Почему CoffeeScript использует %% для modulo вместо стандартного javascript-оператора%

В документации CoffeeScript для операторов говорится, что вы можете использовать %% для истинного математического модуля, но нет объяснений, почему это отличается от "modulo operator" % в JavaScript.

Далее в нем говорится, что a %% b в CoffeeScript эквивалентен написанию (a % b + b) % b в JavaScript, но это, похоже, дает те же результаты для большинства простых случаев.

4b9b3361

Ответ 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 - это математический трюк, позволяющий использовать одну формулу для всех чисел вместо одной для негативов, а второй для положительных. Не знаю, если это больше, чем просто трюк и имеет какое-то внутреннее значение.