Mam szereg obliczeń Javascript, które (tylko w IE) pokazują Infinity w zależności od wyborów użytkownika.
Jak zatrzymać Infinitypojawianie się słowa i na przykład pokazać 0.0zamiast niego?
Odpowiedzi:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Możesz isFinitezamiast tego użyć tej funkcji, w zależności od tego, jak chcesz leczyć NaN. isFinitezwraca, falsejeśli Twój numer to POSITIVE_INFINITY, NEGATIVE_INFINITYlub NaN.
if (isFinite(result))
{
// ...
}
Infinitywłaściwość global nie jest tylko do odczytu, co oznacza, że można ją przedefiniować: na przykład var x = 42; Infinity = 42; alert(x === Infinity);wyświetla wartość „true” . (Trzeba przyznać, że to niejasny przypadek i każdy, kto zdecyduje się na przedefiniowanie Infinity, NaNitp., Powinien spodziewać się dziwnych rzeczy.)
Number.(POSITIVE|NEGATIVE)_INFINITYnie jest tylko do odczytu , Infinity jest tylko do odczytu w trybie ścisłym. A co z -?1/0przypadkiem, który ci przedstawiłem? W każdym razie prawie zawsze powinieneś używać isFinitezamiast tego.
Number.POSITIVE_INFINITYi Number.NEGATIVE_INFINITY są tylko do odczytu (testowane na Chrome8, FF3.6 i IE8). Używanie 1/0działa dobrze, ale dla opiekunów Twojego kodu nie będzie to takie oczywiste, do czego faktycznie próbujesz testować. Zgadzam się, że używanie isFinitejest prawie zawsze lepszym sposobem robienia rzeczy - dlatego wspomniałem o tym w mojej odpowiedzi - ale tylko PO może zdecydować, czy spełnia jego wymagania.
Object.definePropertyi __defineGetter__. InfinityZ drugiej strony, jest non-konfigurowane w trybie ścisłym.
Prosty n === n+1lub n === n/0działa:
function isInfinite(n) {
return n === n/0;
}
Należy pamiętać, że natywny isFinite()przekształca dane wejściowe do liczb. isFinite([])i isFinite(null)oba są truena przykład.
n === n+1zwraca wartość true dla wszystkich liczb większych niż 2 ^ 53, tj. 1e30. Podział działa, nawet dla NaN i -Infinity. Jednak odpowiedź LukeHa daje bardzo czytelny kod.
n+1nie mogą być reprezentowane i podlegają zaokrąglaniu. Cóż, nawet liczby całkowite podlegają błędom zaokrągleń. Przy okazji, nie sądzę, żeby twój kod był "matematyczny", po prostu spróbuj n === n/-0. Podczas uzupełniania liczb rzeczywistych z +/- inf, twój limit nie jest dobrze zdefiniowany, chyba że zakłada się, że podstawowa sekwencja zerowa jest dodatnia.
W ES6, Number.isFinite()Metoda określa, czy przekazana wartość jest liczbą skończoną.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
Lubię używać Lodash z różnych powodów związanych z obroną kodowania, a także z powodu czytelności. ES6 Number.isFinitejest świetny i nie ma problemów z wartościami nienumerycznymi, ale jeśli ES6 nie jest możliwy, masz już lodash lub chcesz krótszy kod: _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Wpadłem na scenariusz, który wymagał ode mnie sprawdzenia, czy wartość jest typu NaNlub, Infinityale przekazanie ciągów znaków jako prawidłowe wyniki. Ponieważ wiele ciągów tekstowych daje wynik fałszywie dodatni NaN, opracowałem proste rozwiązanie, aby obejść ten problem:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Powyższy kod konwertuje wartości na łańcuchy i sprawdza, czy są one ściśle równe NaN lub Nieskończoność (musisz dodać kolejny przypadek dla ujemnej nieskończoności).
Więc:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaNs itp.
toString()zamiast tego użył ? Możesz głosować przeciw lub podać powody, dla których może to przynieść niespójne wyniki lub dlaczego dokładnie ta metoda nie jest zalecana. Jak dotąd nadal czuję, że dodaje opcję dla każdego, kto szuka odpowiedzi i nie ma żadnych konkretnych powodów, dla których jest to niebezpieczne, niestabilne itp.
Możesz użyć isFinite w oknie isFinite(123):
Możesz napisać funkcję taką jak:
function isInfinite(num) {
return !isFinite(num);
}
I używaj jak:
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
Można również Number.isFinitE, która również sprawdzić, czy wartość jest zbyt Number i jest bardziej dokładna dla sprawdzenia undefinedi nulletc ...
Lub możesz wypełnić go w następujący sposób:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITYzamiast-?Infinitylub-?1/0?