%
모듈로 연산자가 아닙니다. 나머지 연산자입니다. JavaScript에는 모듈러스 연산자가 없습니다. 그래서 받아 들여진 대답은 갈 길입니다.
%
모듈로 연산자가 아닙니다. 나머지 연산자입니다. JavaScript에는 모듈러스 연산자가 없습니다. 그래서 받아 들여진 대답은 갈 길입니다.
답변:
Number.prototype.mod = function(n) {
return ((this%n)+n)%n;
};
이 기사에서 가져온 : JavaScript Modulo Bug
x < -n
예 : (-7 + 5) % 5 === -2
하지만) ((-7 % 5) + 5) % 5 == 3
.
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 % 빠릅니다. 물론 성능이 중요하다면 ..
n
들과 m
두 번째 예 @StuR에서 잘못된 방향으로 약이야. 이어야합니다 return ((n % m) + m) % m;
.
%
JavaScript 의 연산자는 모듈로 연산자가 아닌 나머지 연산자입니다 (주요 차이점은 음수가 처리되는 방식에 있음).
-1 % 8 // -1, not 7
remainder
되면 정의에 따라 0보다 커야합니다. 고등학교 의 분할 정리 를 기억할 수 없습니까 ?! 그래서 어쩌면 당신은 여기에 모습을 가질 수 있습니다 en.wikipedia.org/wiki/Euclidean_division
긍정적 인 결과를 반환하는 "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
#sec-applying-the-mod-operator
URL에서 바로 참조 합니다 :) 어쨌든, 메모 주셔서 감사합니다. 내 대답에서 보풀을 가져갔습니다. 어쨌든 중요하지 않습니다.
허용 된 답변은 % 연산자를 재사용하기 때문에 약간 긴장합니다. 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
-
, *
, /
, ;
, .
, (
, )
, ,
, Math.floor
, function
또는 return
변경? 그런 다음 코드가 끔찍하게 손상되었습니다.
나는 음수 a와 음수 n도 처리합니다.
//best perf, hard to read
function modul3(a,n){
r = a/n | 0 ;
if(a < 0){
r += n < 0 ? 1 : -1
}
return a - n * r
}
// shorter code
function modul(a,n){
return a%n + (a < 0 && Math.abs(n));
}
//beetween perf and small code
function modul(a,n){
return a - n * Math[n > 0 ? 'floor' : 'ceil'](a/n);
}
이것은 버그가 아니며 모듈로를 계산하는 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
%
에서는 부정적인 결과를 반환 할 수 있습니다 (이것은 이러한 함수의 목적이며이를 수정하는 것입니다)
parseInt(-41).mod(-7)
반환 -6
됩니다 1
(그리고 이것은 내가 작성한 정수 부분 함수의 목적입니다)
당신을 위해 일할 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
(-13) % 64
나-(13 % 64)
? 개인적으로, 나는 단지 명확성을 위해 두 가지 방법으로 parens를 넣었습니다.