Comment puis-je vérifier si un nombre est évalué à l'infini?
-
12-10-2019 - |
Question
J'ai une série de calculs Javascript que (uniquement sous IE) montrent l'infini en fonction des choix de l'utilisateur.
Comment peut-on arrêter le mot Infinity
apparaissant et par exemple, montrent 0.0
à la place?
La solution
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Vous pourriez éventuellement utiliser la fonction isFinite
à la place, selon la façon dont vous voulez traiter NaN
. retourne isFinite
false
si votre numéro est POSITIVE_INFINITY
, NEGATIVE_INFINITY
ou NaN
.
if (isFinite(result))
{
// ...
}
Autres conseils
A n === n+1
simples ou œuvres n === n/0
:
function isInfinite(n) {
return n === n/0;
}
Sachez que les entrées natives isFinite()
des nombres à contraint. isFinite([])
et isFinite(null)
sont à la fois true
par exemple.
En ES6
, Number.isFinite()
procédé détermine si la valeur transmise est un nombre fini.
Number.isFinite(Infinity); // false
Number.isFinite(NaN); // false
Number.isFinite(-Infinity); // false
Number.isFinite(0); // true
Number.isFinite(2e64); // true
En fait n === n + 1 va travailler pour un nombre plus grand que 51 bits, par exemple.
1e16 + 1 === 1e16; // true
1e16 === Infinity; // false
Je l'ai rencontré un scénario qui m'a obligé de vérifier si la valeur est du type NaN
ou Infinity
mais passer des chaînes comme des résultats valides. Parce que beaucoup de chaînes de texte produiront NaN
faux positifs, je l'ai fait une solution simple à contourner que:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Les convertis de code ci-dessus des valeurs aux chaînes et vérifie si elles sont strictement égal à NaN ou Infinity (vous aurez besoin d'ajouter un autre cas pour l'infini).
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
J'aime utiliser Lodash pour une variété de codage défensif raisons ainsi que lisibilité. ES6 Number.isFinite
est grand et ne pas avoir des problèmes avec des valeurs non numériques, mais si ES6 n'est pas possible, vous avez déjà lodash, ou si vous voulez un code bref: _. isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
Vous pouvez utiliser isFinite dans la fenêtre, isFinite(123)
:
Vous pouvez écrire une fonction comme:
function isInfinite(num) {
return !isFinite(num);
}
Et l'utilisation comme:
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
Vous pouvez également Number.isFinit
e qui vérifie également si la valeur est le numéro trop et est plus précis pour le contrôle undefined
et null
etc ...
Ou vous pouvez polyfill comme ceci:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}