[javascript] JavaScript % (모듈로)는 음수에 대해 음수 결과를 제공합니다.

구글 계산기 에 따르면 (-13) % 64입니다 51.

자바 스크립트에 따르면 (이 참조 JSBin을 그것이) -13.

이 문제를 어떻게 해결합니까?



답변

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

이 기사에서 가져온 : JavaScript Modulo Bug


답변

Number.prototype프로토 타입 방법을 사용할 때마다 숫자가로 래핑되므로 Using 는 SLOW Object입니다. 이 대신에 :

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

사용하다:

function mod(n, m) {
  return ((n % m) + m) % m;
}

참조 : http://jsperf.com/negative-modulo/2

프로토 타입을 사용하는 것보다 ~ 97 % 빠릅니다. 물론 성능이 중요하다면 ..


답변

%JavaScript 의 연산자는 모듈로 연산자가 아닌 나머지 연산자입니다 (주요 차이점은 음수가 처리되는 방식에 있음).

-1 % 8 // -1, not 7


답변

긍정적 인 결과를 반환하는 “mod”함수

var mod = function (n, m) {
    var remain = n % m;
    return Math.floor(remain >= 0 ? remain : remain + m);
};
mod(5,22)   // 5
mod(25,22)  // 3
mod(-1,22)  // 21
mod(-2,22)  // 20
mod(0,22)   // 0
mod(-1,22)  // 21
mod(-21,22) // 1

그리고 물론

mod(-13,64) // 51


답변

허용 된 답변은 % 연산자를 재사용하기 때문에 약간 긴장합니다. Javascript가 나중에 동작을 변경하면 어떻게됩니까?

다음은 %를 재사용하지 않는 해결 방법입니다.

function mod(a, n) {
    return a - (n * Math.floor(a/n));
}

mod(1,64); // 1
mod(63,64); // 63
mod(64,64); // 0
mod(65,64); // 1
mod(0,64); // 0
mod(-1,64); // 63
mod(-13,64); // 51
mod(-63,64); // 1
mod(-64,64); // 0
mod(-65,64); // 63


답변

예상대로 동작하지 않지만 JavaScript가 ‘동작’이 아님을 의미하지는 않습니다. 모듈로 계산을 위해 만들어진 JavaScript입니다. 정의에 따라 두 가지 대답 모두 의미가 있기 때문입니다.

Wikipedia에서 이것을 보십시오 . 다양한 언어가 결과 표시를 어떻게 선택했는지 오른쪽에서 볼 수 있습니다.


답변

경우 x정수이며 n2의 힘, 당신은 사용할 수 있습니다 x & (n - 1)대신 x % n.

> -13 & (64 - 1)
51