Почему рассчитанный оператор по модулю/остатку неверен для больших чисел?

Я пытаюсь понять, почему я не могу вычислить правильный модуль с помощью JavaScript. Операция, которую я пробовал:

Неверный ответ

28493595674446332150349236018567871332790652257295571471311614363091332152517 % 6 = 4

Результат должен быть 1.

28493595674446332150349236018567871332790652257295571471311614363091332152517 % 6 = 1

Я пытался преобразовать это число в BN, но, к сожалению, всегда получаю один и тот же ответ. Однако, если вы используете wolfram alpha или другую математическую программу, она возвращает правильный ответ.

В чем дело? Что я делал не так?


person ARR    schedule 12.02.2020    source источник
comment
Вы имеете в виду по модулю?   -  person putvande    schedule 13.02.2020
comment
Это не оператор по модулю, а оператор остатка. developer.mozilla.org/en-US/ документы/Интернет/JavaScript/Справочник/   -  person evolutionxbox    schedule 13.02.2020
comment
Кроме того... это число слишком велико для JavaScript.   -  person putvande    schedule 13.02.2020
comment
28493595674446332150349236018567871332790652257295571471311614363091332152517 > Number.MAX_SAFE_INTEGER // true - Это слишком много для обычных чисел. Вместо этого рассмотрите возможность использования BigInt.   -  person evolutionxbox    schedule 13.02.2020
comment
Используйте BigInt, вот пример BigInt('28493595674446332150349236018567871332790652257295571471311614363091332152517') % BigInt(6)   -  person Titus    schedule 13.02.2020
comment
просто используйте bigInt 28493595674446332150349236018567871332790652257295571471311614363091332152517n % 6n === 1n   -  person balexandre    schedule 13.02.2020
comment
Литералы @Titus BigInt могут быть созданы без функции. 6n — большое целое число.   -  person evolutionxbox    schedule 13.02.2020
comment
@evolutionxbox Использование функции лучше иллюстрирует, что там происходит.   -  person Titus    schedule 13.02.2020


Ответы (1)


Диапазон целых чисел в JavaScript составляет +/- 9007199254740991 (Number.MAX_SAFE_INTEGER). Ваш номер просто вне досягаемости для JS.

Вы также можете использовать нотацию BigInt, чтобы получить правильный ответ. 28493595674446332150349236018567871332790652257295571471311614363091332152517n % 6n

См. >Каково максимальное целочисленное значение в JavaScript, которому может соответствовать число без потери точности?

person Saeed D.    schedule 12.02.2020
comment
Для ясности суффикс n в конце числа сообщает интерпретатору, что предшествующее число — это bigint. - person ; 13.02.2020