사용자 선택에 따라 무한대를 표시하는 일련의 Javascript 계산이 있습니다 (IE에서만).
Infinity
예를 들어, 단어 표시를 중지하고 0.0
대신 표시 하는 방법은 무엇입니까?
답변:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
. isFinite
을 처리하려는 방법에 따라 대신 함수를 사용할 수 있습니다 NaN
. 번호가 , 또는 인 경우를 isFinite
반환 false
합니다 .POSITIVE_INFINITY
NEGATIVE_INFINITY
NaN
if (isFinite(result))
{
// ...
}
Infinity
속성이 읽기 전용이 아니므로 재정의 할 수 있습니다. 예를 들어 "true"를var x = 42; Infinity = 42; alert(x === Infinity);
표시 합니다 . (분명히 그것은 모호한 경우이며 재정 Infinity
의 NaN
등 을 결정하는 사람은 이상한 일이 일어날 것으로 예상해야합니다.)
Number.(POSITIVE|NEGATIVE)_INFINITY
하거나 읽기 전용되지 않습니다, Infinity
되는 읽기 전용 엄격 모드. 또한 -?1/0
제가 제시 한 사건은 어떻습니까? 어쨌든 거의 항상 isFinite
대신 사용해야 합니다.
Number.POSITIVE_INFINITY
하고 Number.NEGATIVE_INFINITY
있습니다 읽기 전용 (Chrome8, FF3.6과 IE8에서 테스트). 사용 1/0
은 잘 작동하지만 실제로 테스트하려는 코드의 관리자에게는 그다지 분명하지 않습니다. 나는 사용 isFinite
이 거의 항상 일을하는 더 좋은 방법 이라는 데 동의합니다. 그래서 내 대답에서 언급 한 이유입니다. 그러나 OP만이 요구 사항을 충족하는지 여부를 결정할 수 있습니다.
Object.defineProperty
및로 재정의 할 수 있습니다 __defineGetter__
. Infinity
반면에, 이다 엄격 모드에서 구성 할 수없는.
단순 n === n+1
또는 n === n/0
작동 :
function isInfinite(n) {
return n === n/0;
}
네이티브 isFinite()
는 숫자에 대한 입력을 강제합니다. isFinite([])
그리고 isFinite(null)
모두 true
예를 들면.
n === n+1
2 ^ 53, 즉 1e30보다 큰 모든 숫자에 대해 참으로 평가됩니다. 분할 해킹은 NaN 및 -Infinity에서도 작동합니다. 그러나 LukeH의 대답은 더 읽기 쉬운 코드를 제공합니다.
n+1
표현할 수 없으며 반올림됩니다. 음, 정수조차도 반올림 오류의 영향을받습니다. Btw, 귀하의 코드가 "수학 방지"라고 생각하지 않습니다 n === n/-0
.. +/- inf로 실수를 완료 할 때 기본 0 시퀀스가 양수라고 가정하지 않는 한 한계가 잘 정의되지 않습니다.
에서는 ES6
상기 Number.isFinite()
방법은 전달 된 값이 유한 수 있는지 여부를 판정한다.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
나는 가독성뿐만 아니라 다양한 방어 적 코딩 이유로 Lodash 를 사용하는 것을 좋아합니다 . ES6 은 훌륭하고 숫자가 아닌 값에 문제가 없지만 ES6이 가능하지 않다면 이미 lodash가 있거나 간단한 코드를 원합니다 : _.isFiniteNumber.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
값이 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
등의,
toString()
대신 사용하면 더 행복해 질까요 ? 이 방법이 일관성이없는 결과를 낳을 수있는 이유 또는이 방법이 권장되지 않는 이유를 자유롭게 반대하거나 설명하십시오. 지금까지, 나는 여전히 대답을 찾고 누구에 대한 옵션을 추가하고이 위험, 불안 등의 이유 어떤 구체적인 이유가없는 느낌
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);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
대신 사용 하는 이유는 무엇 입니까?-?Infinity
-?1/0