Как правильно использовать оператор модуля (%) в JavaScript?

В JavaScript оператор% ведет себя очень странно. Я пробовал следующее:

>>> (0 - 11) % 12
-11

Почему он возвращает -11 вместо 1 (как в Python)?

Я уверен, что делаю или ожидаю чего-то не так, но документы не говорят мне, что именно.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
6 153
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Он ведет себя правильно в соответствии с тем, как указан язык (например, 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 r from a dividend n and a divisor d is defined by the mathematical relation r = n - (d * q) where q is an integer that is negative only if n/d is negative and positive only if n/d is positive, and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient of n and d. r is 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 правильный ответ ..

«Правильный» зависит от того, как вы определяете модуль упругости. Я подозреваю, что реализация JavaScript верна и по их определению. Перейдите по ссылке в моем ответе - проблема не так очевидна, как вы могли ожидать.

Jon Skeet 17.01.2009 15:13

Есть две похожие операции: по модулю и остаток. 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. Это второе определение означает, что оно всегда возвращает положительное число. Что он?

Другие вопросы по теме