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' Infinityapparaître et, par exemple, montrer à la 0.0place?
Réponses:
if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
// ...
}
Vous pouvez éventuellement utiliser la isFinitefonction à la place, selon la façon dont vous souhaitez traiter NaN. isFiniteretourne falsesi votre numéro est POSITIVE_INFINITY, NEGATIVE_INFINITYou NaN.
if (isFinite(result))
{
// ...
}
Infinityproprié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, NaNetc. devrait s'attendre à ce que des choses étranges se produisent.)
Number.(POSITIVE|NEGATIVE)_INFINITYn'est pas non plus en lecture seule, Infinity est en lecture seule en mode strict. Et qu'en est-il du -?1/0cas que je vous ai présenté? Quoi qu'il en soit, vous devriez presque toujours utiliser à la isFiniteplace.
Number.POSITIVE_INFINITYet Number.NEGATIVE_INFINITY sont en lecture seule (testés sur Chrome8, FF3.6 et IE8). L'utilisation 1/0fonctionne 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 isFiniteest 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.definePropertyet __defineGetter__. Infinity, d'autre part, n'est pas configurable en mode strict.
Un simple n === n+1ou n === n/0fonctionne:
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 truepar exemple.
n === n+1vaut 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+1ne 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.isFiniteest 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 NaNou Infinitymais à 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
NaNs, 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.isFinitvérifier si la valeur est également Number et est plus précise pour la vérification undefined, nulletc.
Ou vous pouvez le polyfill comme ceci:
Number.isFinite = Number.isFinite || function(value) {
return typeof value === 'number' && isFinite(value);
}
Number.(POSITIVE|NEGATIVE)_INFINITYplace de-?Infinityou-?1/0?