Wie überprüfe ich, ob eine Zahl unendlich ergibt?

Lesezeit: 5 Minuten

Benutzer-Avatar
Homer_J

Ich habe eine Reihe von Javascript-Berechnungen, die (nur unter IE) Infinity je nach Benutzerauswahl anzeigen.

Wie hält man das Wort Infinity erscheinen und zum Beispiel zeigen 0.0 stattdessen?

Benutzer-Avatar
Lukas H

if (result == Number.POSITIVE_INFINITY || result == Number.NEGATIVE_INFINITY)
{
    // ...
}

Du könntest evtl. die verwenden isFinite Funktion stattdessen, je nachdem, wie Sie behandeln möchten NaN. isFinite kehrt zurück false wenn deine Nummer ist POSITIVE_INFINITY, NEGATIVE_INFINITY oder NaN.

if (isFinite(result))
{
    // ...
}

  • Warum verwenden Number.(POSITIVE|NEGATIVE)_INFINITY Anstatt von -?Infinity oder -?1/0?

    – Eli Gray

    18. Januar 2011 um 13:37 Uhr

  • @Eli: Die globale Infinity Die Eigenschaft ist nicht schreibgeschützt, was bedeutet, dass sie neu definiert werden kann: Zum Beispiel var x = 42; Infinity = 42; alert(x === Infinity); zeigt “Stimmt”. (Zugegeben, das ist ein obskurer Fall, und jeder, der sich für eine Neudefinition entscheidet Infinity, NaN usw. sollten damit rechnen, dass seltsame Dinge passieren.)

    – LukasH

    18. Januar 2011 um 13:49 Uhr

  • Ignoriert die Tatsache, dass Number.(POSITIVE|NEGATIVE)_INFINITY ist auch nicht schreibgeschützt, Infinity ist schreibgeschützt im strikten Modus. Auch was ist mit der -?1/0 Fall, den ich Ihnen vorgestellt habe? Wie auch immer, Sie sollten fast immer verwenden isFinite stattdessen.

    – Eli Grau

    18. Januar 2011 um 15:36 Uhr


  • @Eli: In meinen Tests Number.POSITIVE_INFINITY und Number.NEGATIVE_INFINITY sind schreibgeschützt (getestet auf Chrome8, FF3.6 und IE8). Verwenden 1/0 funktioniert gut, aber es wird für Betreuer Ihres Codes nicht so offensichtlich sein, worauf Sie tatsächlich testen möchten. Ich stimme der Verwendung zu isFinite ist fast immer der bessere Weg, Dinge zu tun – deshalb habe ich es in meiner Antwort erwähnt -, aber nur das OP kann entscheiden, ob es seinen Anforderungen entspricht.

    – LukasH

    18. Januar 2011 um 15:58 Uhr

  • Sie sind nicht schreibgeschützt (lesen Sie: nicht konfigurierbar), sie sind nur Accessoren mit Gettern, aber keinen Settern. Sie können sie mit neu definieren Object.defineProperty und __defineGetter__. Infinityauf der anderen Seite, ist im strikten Modus nicht konfigurierbar.

    – Eli Gray

    19. Januar 2011 um 20:12 Uhr


Im ES6Das Number.isFinite() -Methode bestimmt, ob der übergebene Wert eine endliche Zahl ist.

Number.isFinite(Infinity);  // false
Number.isFinite(NaN);       // false
Number.isFinite(-Infinity); // false

Number.isFinite(0);         // true
Number.isFinite(2e64);      // true

  • Zugänglich aus ECMAScript 1

    – MohaMad

    27. Juli 2017 um 10:16 Uhr

Eine einfache n === n+1 oder n === n/0 funktioniert:

function isInfinite(n) {
  return n === n/0;
}

Seien Sie sich bewusst, dass der Eingeborene isFinite() erzwingt Eingaben in Zahlen. isFinite([]) und isFinite(null) sind beide true zum Beispiel.

  • Diese Antwort ist schlichtweg falsch. n === n+1 wird für alle Zahlen größer als 2^53 als wahr ausgewertet, dh 1e30. Der Division-Hack funktioniert sogar für NaN und -Infinity. Die Antwort von LukeH gibt Ihnen jedoch einen viel besser lesbaren Code.

    – Glas

    4. September 2018 um 6:47 Uhr

  • @tglas Warum ist das Plus so? Ich bin froh, dass die Division solide ist. Meiner Meinung nach ist mein Code besser lesbar und inklusiver, weil Mathematik universeller ist als Worte.

    – ryanve

    12. September 2018 um 14:40 Uhr


  • Da IEEE 64bit Floats 53 signifikante Binärziffern haben (vgl de.wikipedia.org/wiki/IEEE_754 ), Also n+1 nicht darstellbar und wird gerundet. Nun, sogar ganze Zahlen sind von Rundungsfehlern betroffen. Übrigens, ich glaube nicht, dass Ihr Code “mathesicher” ist, versuchen Sie es einfach n === n/-0. Wenn Sie die Realwerte mit +/-inf vervollständigen, ist Ihr Limit nicht genau definiert, es sei denn, die zugrunde liegende Nullsequenz wird als positiv angenommen.

    – Glas

    13. September 2018 um 21:14 Uhr

  • Danke @tglas Ich werde es immer lieben, dass JavaScript durch Null dividieren kann 🙂

    – ryanve

    18. September 2018 um 20:45 Uhr

Tatsächlich funktioniert n === n + 1 für Zahlen, die größer als 51 Bit sind, z

1e16 + 1 === 1e16; // true
1e16 === Infinity; // false

Benutzer-Avatar
Константин Ван

Führen Sie den einfachen Vergleich durch:

(number === Infinity || number === -Infinity)

oder um mehrere Zeichen zu speichern:

Math.abs(number) === Infinity

Warum sollte man das verwenden

  1. !(Number.isFinite(number)) bricht an NaN Eingänge.
  2. Number.POSITIVE_INFINITY und Number.NEGATIVE_INFINITY kann neu definiert werden; sie sind konfigurierbar.
  3. Infinity und -Infinity sind schreibgeschützt das strikter Modus.
  4. Es ist die kürzeste Lösung.

Benutzer-Avatar
random_user_name

benutze ich gerne Lodash für eine Vielzahl von defensive Codierung Gründe sowie Lesbarkeit. ES6 Number.isFinite ist großartig und hat keine Probleme mit nicht numerischen Werten, aber wenn ES6 nicht möglich ist, haben Sie bereits lodash oder möchten einen kürzeren Code: _.istEndlich

_.isFinite(Infinity); // false
_.isFinite(NaN); // false
_.isFinite(-Infinity); // false

_.isFinite(null); // false
_.isFinite(3); // true
_.isFinite('3'); // true

Benutzer-Avatar
dmitrizzle

Ich bin auf ein Szenario gestoßen, bei dem ich überprüfen musste, ob der Wert der ist NaN oder Infinity eingeben, aber Zeichenfolgen als gültige Ergebnisse übergeben. Weil viele Textzeichenfolgen falsch-positiv produzieren NaNhabe ich eine einfache Lösung gefunden, um das zu umgehen:

  const testInput = input => input + "" === "NaN" || input + "" === "Infinity";

Der obige Code konvertiert Werte in Zeichenfolgen und prüft, ob sie genau gleich NaN oder Infinity sind (Sie müssen einen weiteren Fall für negative Unendlichkeit hinzufügen).

So:

testInput(1/0); // true
testInput(parseInt("String")); // true
testInput("String"); // false

  • Dieser Beitrag befasst sich nicht wirklich mit der eigentlichen Frage hier und wäre besser als Kommentar unter der akzeptierten Antwort gewesen. Im OP geht es um Zahlen und Unendlichkeit, nicht um Strings und NaNs usw.

    – code_dredd

    30. September 2019 um 21:41 Uhr

  • Sie haben wahrscheinlich recht, @code_dredd – die Anekdote ist nicht relevant. Aber die Lösung funktioniert immer noch: Es kann die Unendlichkeitszahl erkennen – bitte korrigieren Sie mich, wenn ich falsch liege.

    – Dmitrizzle

    1. Oktober 2019 um 23:32 Uhr

  • Das ist nebensächlich. Es gibt bereits eine Antwort, die zeigt, wie das geht korrekt. Was Sie haben, “funktioniert” einfach, weil die Sprache selbst dumme Dinge tut und nicht mit der Art und Weise übereinstimmt, wie sie Typen verwaltet. Bitte ersparen Sie sich das Schreiben von Hackcode wie diesem.

    – code_dredd

    1. Oktober 2019 um 23:38 Uhr

  • Würde es dich glücklicher machen, wenn ich es benutzte toString() stattdessen? Fühlen Sie sich frei, abzulehnen oder Gründe anzugeben, warum dies zu inkonsistenten Ergebnissen führen könnte oder warum genau diese Methode nicht empfohlen wird. Bisher habe ich immer noch das Gefühl, dass es eine Option für alle hinzufügt, die nach einer Antwort suchen, und es gibt keine konkreten Gründe, warum dies gefährlich, instabil usw. ist.

    – Dmitrizzle

    3. Oktober 2019 um 22:08 Uhr

1215920cookie-checkWie überprüfe ich, ob eine Zahl unendlich ergibt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy