숫자가 무한대로 평가되는지 어떻게 확인합니까?


94

사용자 선택에 따라 무한대를 표시하는 일련의 Javascript 계산이 있습니다 (IE에서만).

Infinity예를 들어, 단어 표시를 중지하고 0.0대신 표시 하는 방법은 무엇입니까?

답변:


174
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

. isFinite을 처리하려는 방법에 따라 대신 함수를 사용할 수 있습니다 NaN. 번호가 , 또는 인 경우를 isFinite반환 false합니다 .POSITIVE_INFINITYNEGATIVE_INFINITYNaN

if (isFinite(result))
{
    // ...
}

2
또는 Number.(POSITIVE|NEGATIVE)_INFINITY대신 사용 하는 이유는 무엇 입니까? -?Infinity-?1/0
Eli Gray

5
@Eli : 전역 Infinity속성이 읽기 전용이 아니므로 재정의 할 수 있습니다. 예를 들어 "true"를var x = 42; Infinity = 42; alert(x === Infinity); 표시 합니다 . (분명히 그것은 모호한 경우이며 재정 InfinityNaN등 을 결정하는 사람은 이상한 일이 일어날 것으로 예상해야합니다.)
LukeH

사실을 무시 Number.(POSITIVE|NEGATIVE)_INFINITY하거나 읽기 전용되지 않습니다, Infinity 되는 읽기 전용 엄격 모드. 또한 -?1/0제가 제시 한 사건은 어떻습니까? 어쨌든 거의 항상 isFinite대신 사용해야 합니다.
Eli Gray

1
@Eli : 내 테스트에서 Number.POSITIVE_INFINITY하고 Number.NEGATIVE_INFINITY 있습니다 읽기 전용 (Chrome8, FF3.6과 IE8에서 테스트). 사용 1/0은 잘 작동하지만 실제로 테스트하려는 코드의 관리자에게는 그다지 분명하지 않습니다. 나는 사용 isFinite이 거의 항상 일을하는 더 좋은 방법 이라는 데 동의합니다. 그래서 내 대답에서 언급 한 이유입니다. 그러나 OP만이 요구 사항을 충족하는지 여부를 결정할 수 있습니다.
LukeH 2011 년

4
읽기 전용이 아니며 (read : non-configurable ), getter가있는 접근 자이지만 setter는 없습니다. Object.defineProperty및로 재정의 할 수 있습니다 __defineGetter__. Infinity반면에, 이다 엄격 모드에서 구성 할 수없는.
Eli Gray

9

단순 n === n+1또는 n === n/0작동 :

function isInfinite(n) {
  return n === n/0;
}

네이티브 isFinite()는 숫자에 대한 입력을 강제합니다. isFinite([])그리고 isFinite(null)모두 true예를 들면.


이 대답은 분명히 잘못되었습니다. n === n+12 ^ 53, 즉 1e30보다 큰 모든 숫자에 대해 참으로 평가됩니다. 분할 해킹은 NaN 및 -Infinity에서도 작동합니다. 그러나 LukeH의 대답은 더 읽기 쉬운 코드를 제공합니다.
tglas

@tglas 플러스가 왜 ​​그런가요? 부서가 견고해서 다행입니다. IMO 내 코드는 수학이 단어보다 더 보편적이기 때문에 더 읽기 쉽고 포괄적입니다.
ryanve

1
IEEE 64 비트 부동 소수점에는 53 개의 유효 이진 숫자가 있기 때문에 ( en.wikipedia.org/wiki/IEEE_754 참조 ) n+1표현할 수 없으며 반올림됩니다. 음, 정수조차도 반올림 오류의 영향을받습니다. Btw, 귀하의 코드가 "수학 방지"라고 생각하지 않습니다 n === n/-0.. +/- inf로 실수를 완료 할 때 기본 0 시퀀스가 ​​양수라고 가정하지 않는 한 한계가 잘 정의되지 않습니다.
tglas

감사합니다 @tglas 거 야 자바 스크립트가 제로 :)으로 나눌 수 있음을 항상 사랑
ryanve

6

에서는 ES6상기 Number.isFinite()방법은 전달 된 값이 유한 수 있는지 여부를 판정한다.

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

ECMAScript 1에서 액세스 가능
MohaMad

2

실제로 n === n + 1은 51 비트보다 큰 숫자에 대해 작동합니다.

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

3
이것은 ryanve의 답변에 대한 의견이어야합니다.
Gary

1

나는 가독성뿐만 아니라 다양한 방어 적 코딩 이유로 Lodash 를 사용하는 것을 좋아합니다 . ES6 은 훌륭하고 숫자가 아닌 값에 문제가 없지만 ES6이 가능하지 않다면 이미 lodash가 있거나 간단한 코드를 원합니다 : _.isFiniteNumber.isFinite

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

0

값이 NaN또는 Infinity형식 인지 확인해야 하지만 유효한 결과로 문자열을 전달 해야하는 시나리오에 직면했습니다. 많은 텍스트 문자열이 false-positive를 생성 NaN하므로이를 우회하는 간단한 솔루션을 만들었습니다.

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

위의 코드는 값을 문자열로 변환하고 값이 NaN 또는 Infinity와 정확히 같은지 확인합니다 (음의 무한대에 대해 다른 대소 문자를 추가해야 함).

그래서:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

이 게시물은 실제 질문을 실제로 다루지 않으며 수락 된 답변 아래의 의견으로 더 좋았을 것입니다. 영업 숫자와 무한대가 아닌 문자열과에 관한 NaN등의,
code_dredd

아마 맞습니다, @code_dredd-일화는 관련이 없습니다. 그러나 해결책은 여전히 ​​작동합니다 : 무한대를 감지 할 수 있습니다-내가 틀렸다면 수정하십시오.
dmitrizzle

그것은 요점을 벗어났습니다. 이 작업을 올바르게 수행하는 방법을 보여주는 답변이 이미 있습니다 . 언어 자체가 어리석은 일을 수행하고 유형을 관리하는 방법과 일치하지 않기 때문에 "작동"합니다. 이와 같은 해킹 코드를 작성하지 마십시오.
code_dredd

toString()대신 사용하면 더 행복해 질까요 ? 이 방법이 일관성이없는 결과를 낳을 수있는 이유 또는이 방법이 권장되지 않는 이유를 자유롭게 반대하거나 설명하십시오. 지금까지, 나는 여전히 대답을 찾고 누구에 대한 옵션을 추가하고이 위험, 불안 등의 이유 어떤 구체적인 이유가없는 느낌
dmitrizzle가

-1

isFinite 를 창에서 사용할 수 있습니다 isFinite(123).

다음과 같은 함수를 작성할 수 있습니다.

function isInfinite(num) {
 return !isFinite(num);
}

그리고 다음과 같이 사용하십시오.

isInfinite(null); //false
isInfinite(1); //false
isInfinite(0); //false
isInfinite(0.00); //false
isInfinite(NaN); //true
isInfinite(-1.797693134862316E+308); //true
isInfinite(Infinity); //true
isInfinite(-Infinity); //true
isInfinite(+Infinity); //true
isInfinite(undefined); //true

또한 Number.isFinit값이 숫자인지 확인 undefined하고 확인하는 데 더 정확한 null등 을 확인할 수도 있습니다 .

또는 다음 과 같이 폴리 필 할 수 있습니다 .

Number.isFinite = Number.isFinite || function(value) {
  return typeof value === 'number' && isFinite(value);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.