답변
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
정수이며 n
2의 힘, 당신은 사용할 수 있습니다 x & (n - 1)
대신 x % n
.
> -13 & (64 - 1)
51