В JavaScript оператор% ведет себя очень странно. Я пробовал следующее:
>>> (0 - 11) % 12
-11
Почему он возвращает -11 вместо 1 (как в Python)?
Я уверен, что делаю или ожидаю чего-то не так, но документы не говорят мне, что именно.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Он ведет себя правильно в соответствии с тем, как указан язык (например, ECMA 262), где он называется оператором остатка, а не оператором модуля. Из спецификации:
The result of an ECMAScript floating-point remainder operation is determined by the rules of IEEE arithmetic:
- If either operand is NaN, the result is NaN.
- The sign of the result equals the sign of the dividend.
- If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
- If the dividend is finite and the divisor is an infinity, the result equals the dividend.
- If the dividend is a zero and the divisor is nonzero and finite, the result is the same as the dividend.
- In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved, the floating-point remainder
rfrom a dividendnand a divisordis defined by the mathematical relationr = n - (d * q)whereqis an integer that is negative only ifn/dis negative and positive only ifn/dis positive, and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient ofnandd.ris computed and rounded to the nearest representable value using IEEE 754 round-to-nearest mode.
В вашем случае n/d отрицательный, поэтому результат отрицательный.
См. Запись в Википедии по модулю для более подробной информации, включая список языков с поведением в терминах знака результата.
-11 <12, поэтому я предполагаю, что они на самом деле не делятся: Итак -11 = 0x12 -11
Попробуйте с (0-13)% 12
fmod из математического модуля корректно ведет себя в python:
>>> from math import *
>>> fmod(-11, 12)
-11.0
-11 правильный ответ ..
Есть две похожие операции: по модулю и остаток. Modulo представляет собой более математическое использование, а остальное - более использование ИТ.
Предположим, у нас есть два целых числа a и b.
MOD (a, b) вернет результат, имеющий тот же знак, что и b.
REM (a, b) вернет результат, имеющий тот же знак, что и a. - это то, что реализовано в C / C++ / C# как оператор% и часто ошибочно называется "мод"
Вы тоже можете думать об этом так:
MOD (a, b) найдет наибольшее целое число, кратное b (назовите его "c"), которое меньше a, и вернет (a - c).
например MOD (-340,60) мы находим c = -360 - наибольшее кратное 60, которое меньше -340. Итак, мы делаем (-340 - (-360)) = 20.
REM (a, b) вернет такое значение, что (DIV (a, b) * b) + REM (a, b) = a, где DIV () представляет собой целочисленное деление.
Итак, для r = REM (-340, 60)
-340 = DIV (-340,60) * 60 + r = -5 * 60 + г = г - 300
Это дает нам r = -40.
Вы говорите, что MOD (a, b) вернет результат с тем же знаком, что и b, но затем скажете, что он вернет (a-c), где c меньше, чем a. Это второе определение означает, что оно всегда возвращает положительное число. Что он?
«Правильный» зависит от того, как вы определяете модуль упругости. Я подозреваю, что реализация JavaScript верна и по их определению. Перейдите по ссылке в моем ответе - проблема не так очевидна, как вы могли ожидать.