J'ai une série de calculs Javascript qui (uniquement sous IE) montrent Infinity en fonction des choix de l'utilisateur.
Comment empêcher le mot d' Infinity
apparaître et, par exemple, montrer à la 0.0
place?
Réponses:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Vous pouvez éventuellement utiliser la isFinite
fonction à la place, selon la façon dont vous souhaitez traiter NaN
. isFinite
retourne false
si votre numéro est POSITIVE_INFINITY
, NEGATIVE_INFINITY
ou NaN
.
if (isFinite(result))
{
// ...
}
Infinity
propriété globale n'est pas en lecture seule, ce qui signifie qu'elle peut être redéfinie: par exemple, var x = 42; Infinity = 42; alert(x === Infinity);
affiche "true" . (Certes, c'est un cas obscur, et quiconque décide de redéfinir Infinity
, NaN
etc. devrait s'attendre à ce que des choses étranges se produisent.)
Number.(POSITIVE|NEGATIVE)_INFINITY
n'est pas non plus en lecture seule, Infinity
est en lecture seule en mode strict. Et qu'en est-il du -?1/0
cas que je vous ai présenté? Quoi qu'il en soit, vous devriez presque toujours utiliser à la isFinite
place.
Number.POSITIVE_INFINITY
et Number.NEGATIVE_INFINITY
sont en lecture seule (testés sur Chrome8, FF3.6 et IE8). L'utilisation 1/0
fonctionne bien, mais ce ne sera pas si évident pour les responsables de votre code ce que vous essayez réellement de tester. Je conviens que l'utilisation isFinite
est presque toujours la meilleure façon de faire les choses - c'est pourquoi je l'ai mentionné dans ma réponse - mais seul le PO peut décider si cela répond à leurs exigences.
Object.defineProperty
et __defineGetter__
. Infinity
, d'autre part, n'est pas configurable en mode strict.
Un simple n === n+1
ou n === n/0
fonctionne:
function isInfinite(n) {
return n === n/0;
}
Sachez que le natif isFinite()
contraint les entrées aux nombres. isFinite([])
et isFinite(null)
sont les deux true
par exemple.
n === n+1
vaut vrai pour tous les nombres supérieurs à 2 ^ 53, c'est-à-dire 1e30. Le hack de division fonctionne, même pour NaN et -Infinity. Cependant, la réponse de LukeH vous donne un code plus lisible.
n+1
ne peuvent donc pas être représentés et sont sujets à des arrondis. Eh bien, même les entiers sont affectés par les erreurs d'arrondi. Btw, je ne pense pas que votre code soit "math-proof", essayez juste n === n/-0
. Lorsque vous complétez les réels avec +/- inf, votre limite n'est pas bien définie à moins que la séquence zéro sous-jacente ne soit supposée positive.
In ES6
, La Number.isFinite()
méthode 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
J'aime utiliser Lodash pour diverses raisons de codage défensif ainsi que pour la lisibilité. ES6 Number.isFinite
est génial et n'a pas de problèmes avec les valeurs non numériques, mais si ES6 n'est pas possible, vous avez déjà lodash ou voulez un code plus court : _.isFinite
_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false
_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true
J'ai rencontré un scénario qui m'obligeait à vérifier si la valeur est du type NaN
ou Infinity
mais à passer des chaînes comme résultats valides. Étant donné que de nombreuses chaînes de texte produiront des faux positifs NaN
, j'ai proposé une solution simple pour contourner cela:
const testInput = input => input + "" === "NaN" || input + "" === "Infinity";
Le code ci-dessus convertit les valeurs en chaînes et vérifie si elles sont strictement égales à NaN ou Infinity (vous devrez ajouter un autre cas pour l'infini négatif).
Alors:
testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false
NaN
s, etc.
toString()
place? N'hésitez pas à voter contre ou à indiquer les raisons pour lesquelles cela pourrait donner des résultats incohérents ou pourquoi exactement cette méthode n'est pas recommandée. Jusqu'à présent, je pense toujours que cela ajoute une option pour quiconque cherche une réponse et il n'y a pas de raisons concrètes pour lesquelles c'est dangereux, instable, etc.
Vous pouvez utiliser isFinite dans la fenêtre, isFinite(123)
:
Vous pouvez écrire une fonction comme:
function isInfinite(num) {
return !isFinite(num);
}
Et utilisez 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
vérifier si la valeur est également Number et est plus précise pour la vérification undefined
, null
etc.
Ou vous pouvez le polyfill comme ceci:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITY
place de-?Infinity
ou-?1/0
?