JavaScript% (по модулю) дает отрицательный результат для отрицательных чисел - PullRequest
218 голосов
/ 17 декабря 2010

Согласно Google Calculator (-13) % 64 равен 51.

Согласно Javascript (см. JSBin ) это -13.

Как мне это исправить?

Ответы [ 12 ]

1 голос
/ 04 января 2014

Это не ошибка, есть 3 функции для вычисления по модулю, вы можете использовать ту, которая соответствует вашим потребностям (я бы рекомендовал использовать евклидову функцию)

Усечение функции десятичной части

console.log(  41 %  7 ); //  6
console.log( -41 %  7 ); // -6
console.log( -41 % -7 ); // -6
console.log(  41 % -7 ); //  6

Функция целочисленной части

Number.prototype.mod = function(n) {
    return ((this%n)+n)%n;
};

console.log( parseInt( 41).mod( 7) ); //  6
console.log( parseInt(-41).mod( 7) ); //  1
console.log( parseInt(-41).mod(-7) ); // -6
console.log( parseInt( 41).mod(-7) ); // -1

евклидова функция

Number.prototype.mod = function(n) {
    var m = ((this%n)+n)%n;
    return m < 0 ? m + Math.abs(n) : m;
};

console.log( parseInt( 41).mod( 7) ); // 6
console.log( parseInt(-41).mod( 7) ); // 1
console.log( parseInt(-41).mod(-7) ); // 1
console.log( parseInt( 41).mod(-7) ); // 6
0 голосов
/ 21 июля 2017

Существует пакет NPM, который сделает всю работу за вас.Вы можете установить его с помощью следующей команды.

npm install just-modulo --save

Использование, скопированное из README

import modulo from 'just-modulo';

modulo(7, 5); // 2
modulo(17, 23); // 17
modulo(16.2, 3.8); // 17
modulo(5.8, 3.4); //2.4
modulo(4, 0); // 4
modulo(-7, 5); // 3
modulo(-2, 15); // 13
modulo(-5.8, 3.4); // 1
modulo(12, -1); // NaN
modulo(-3, -8); // NaN
modulo(12, 'apple'); // NaN
modulo('bee', 9); // NaN
modulo(null, undefined); // NaN

GitHub, можно найти по следующей ссылке:

https://github.com/angus-c/just/tree/master/packages/number-modulo

...