[javascript] 자바 스크립트의 Number.sign ()

숫자 부호 ( signum 함수 ) 를 찾는 사소한 방법이 있는지 궁금 하십니까?
명백한 것보다 짧거나 빠르거나 우아한 솔루션 일 수 있습니다.

var sign = number > 0 ? 1 : number < 0 ? -1 : 0;

짧은 답변!

이것을 사용하면 안전하고 빠를 것입니다 (출처 : moz )

if (!Math.sign) Math.sign = function(x) { return ((x > 0) - (x < 0)) || +x; };

성능 및 유형 강제 비교 바이올린 을보고 싶을 수 있습니다.

오랜 시간이 지났습니다. 또한 주로 역사적 이유 때문입니다.


결과

지금은 다음과 같은 솔루션이 있습니다.


1. 명확하고 빠름

function sign(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }

1.1. kbec 에서 수정 -한 가지 유형은 더 적고 성능이 뛰어나며 짧게 [가장 빠름]

function sign(x) { return x ? x < 0 ? -1 : 1 : 0; }

주의: sign("0") -> 1


2. 우아하고 짧고 빠르지 않음 [가장 느림]

function sign(x) { return x && x / Math.abs(x); }

주의 : sign(+-Infinity) -> NaN ,sign("0") -> NaN

현재 InfinityJS의 법적 번호는이 솔루션이 완전히 정확하지 않은 것 같습니다.


3. 예술 …하지만 매우 느림 [가장 느림]

function sign(x) { return (x > 0) - (x < 0); }

4. 빠른 비트 시프트를 사용
하지만sign(-Infinity) -> 0

function sign(x) { return (x >> 31) + (x > 0 ? 1 : 0); }

5. 형식 안전 [megafast]

! 브라우저 (특히 크롬의 v8)가 일부 마법 최적화를 수행하는 것처럼 보이며이 솔루션은 2 개의 추가 작업이 포함되어 있고 논리적으로 결코 더 빠를 수 없음에도 불구하고 (1.1)보다 훨씬 더 성능이 뛰어난 것으로 나타났습니다.

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? 0 : NaN : NaN;
}

도구

개선을 환영합니다!


[Offtopic] 수락 된 답변

  • Andrey Tarantsov- 예술에 +100이지만 슬프게도 명백한 접근 방식보다 약 5 배 느립니다.

  • Frédéric Hamidi- 어쩐지 가장 많이 찬성 된 답변 (글을 쓰는 동안) 그리고 다소 멋지지만, 일을 어떻게해야하는지 확실히 아니에요, imho. 또한 숫자이기도 한 무한대 숫자를 올바르게 처리하지 못합니다.

  • kbec- 명백한 솔루션의 개선입니다. 그다지 혁명적이지는 않지만 모두 종합하면이 접근법이 가장 좋다고 생각합니다. 그를 위해 투표하십시오 🙂



답변

보다 우아한 버전의 빠른 솔루션 :

var sign = number?number<0?-1:1:0


답변

숫자를 절대 값으로 나누면 부호도 제공됩니다. 단락 논리 AND 연산자를 사용하면 특수한 경우가 가능 0하므로 분할하지 않습니다.

var sign = number && number / Math.abs(number);


답변

찾고있는 함수는 signum 이며이를 구현하는 가장 좋은 방법은 다음과 같습니다.

function sgn(x) {
  return (x > 0) - (x < 0);
}


답변

JavaScript (ECMAScript)의 부호있는 0을 지원하지 않아야합니까? “megafast”함수에서 0이 아닌 x를 반환 할 때 작동하는 것 같습니다.

function sign(x) {
    return typeof x === 'number' ? x ? x < 0 ? -1 : 1 : x === x ? x : NaN : NaN;
}

따라서 ECMAScript의 Math.sign ( MDN ) 초안과 호환됩니다 .

x가 양수인지, 음수인지 또는 0인지 나타내는 x의 부호를 반환합니다.

  • x가 NaN이면 결과는 NaN입니다.
  • x가 −0이면 결과는 −0입니다.
  • x가 +0이면 결과는 +0입니다.
  • x가 음수이고 −0이 아니면 결과는 −1입니다.
  • x가 +0이 아니라 양수이면 결과는 +1입니다.

답변

최신 브라우저에서 진행되는 작업에 관심이있는 사람들을 위해 ES6 버전에는 기본 Math.sign 메서드가 있습니다. 여기 에서 지원을 확인할 수 있습니다 .

기본적으로 반환 -1, 1, 0또는NaN

Math.sign(3);     //  1
Math.sign(-3);    // -1
Math.sign('-3');  // -1
Math.sign(0);     //  0
Math.sign(-0);    // -0
Math.sign(NaN);   // NaN
Math.sign('foo'); // NaN
Math.sign();      // NaN


답변

var sign = number >> 31 | -number >>> 31;

Infinity가 필요하지 않고 숫자가 openjdk-7 소스에서 찾을 수있는 정수라는 것을 아는 경우 초고속 : java.lang.Integer.signum()


답변

재미를 위해 이것을 추가 할 것이라고 생각했습니다.

function sgn(x){
  return 2*(x>0)-1;
}

0 및 NaN 반환 -1
+/- 무한대에서 잘 작동합니다.