JavaScript Zahlen
JavaScript unterstützt verschiedene Zahlentypen. Dieses Kapitel erklärt Gleitkommazahlen, Sonderwerte wie NaN und Infinity sowie Konvertierungsfunktionen.
Einführung in JavaScript Zahlen
JavaScript ist eine dynamische Sprache, und die Art, wie sie Zahlen speichert, hat direkte Konsequenzen für den alltäglichen Code: warum 0.1 + 0.2 nicht exakt 0.3 ergibt, warum sehr große Ganzzahlen an Präzision verlieren und wie man Werte sicher rundet, formatiert und parst. Diese Seite behandelt den regulären number-Typ, die Sonderwerte Infinity und NaN, Konvertierungsfunktionen und die Fallstricke, über die die meisten Entwickler stolpern – mit ausführbaren Beispielen, die Sie bearbeiten können.
Zahlentypen verstehen
JavaScript hat genau zwei numerische Datentypen:
number— der alltägliche Typ. Er verwendet das 64-Bit-Format IEEE-754 ("Doppelte Genauigkeit Gleitkommazahl"), sodass derselbe Typ sowohl Ganzzahlen wie42als auch Dezimalzahlen wie3.14speichert. Es gibt kein separatesintoderfloat.BigInt— für Ganzzahlen jenseits des sicheren Bereichs vonnumber(mehr dazu weiter unten). Ein BigInt-Literal endet aufn, z. B.9007199254740993n.
Mit typeof lassen sie sich unterscheiden:
Zahlen in JavaScript schreiben
Neben einfachen Ziffern bietet JavaScript einige Annehmlichkeiten für die Lesbarkeit:
let billion = 1e9; // scientific notation → 1000000000
let ms = 1e-6; // 0.000001 (one microsecond)
let big = 1_000_000; // underscores as visual separators (ES2021)1e9 bedeutet „1 gefolgt von 9 Nullen"; 1e-6 bedeutet „Dezimalpunkt 6 Stellen nach links verschieben". Die Unterstriche in 1_000_000 werden von der Engine ignoriert – sie helfen nur Menschen, große Zahlen zu lesen.
Hexadezimal-, Binär- und Oktalzahlen
JavaScript kann Literale in verschiedenen Zahlensystemen lesen. Alle werden als derselbe number-Typ gespeichert – nur die Notation unterscheidet sich:
let hex = 0xFF; // 255 (base 16, prefix 0x)
let bin = 0b1010; // 10 (base 2, prefix 0b)
let oct = 0o744; // 484 (base 8, prefix 0o)Die toString-Methode
num.toString(base) konvertiert eine Zahl in einen string in einer beliebigen Basis von 2 bis 36 – die umgekehrte Richtung der obigen Literale:
Hinweis: Um eine Methode direkt auf einem Literal aufzurufen, benötigt man zwei Punkte oder Klammern – 255..toString(16) oder (255).toString(16) –, da 255. als Dezimalpunkt interpretiert wird.
Rundungsmethoden
JavaScript stellt mehrere Funktionen zum Runden von Zahlen bereit:
Math.floor(): Rundet eine Zahl auf die nächste Ganzzahl ab.
Math.ceil(): Rundet eine Zahl auf die nächste Ganzzahl auf.
Math.round(): Rundet eine Zahl nach den üblichen mathematischen Regeln auf die nächste Ganzzahl.
Math.trunc(): Entfernt alle Nachkommastellen und kürzt die Zahl damit ab.
Der Unterschied zwischen Math.floor und Math.trunc zeigt sich nur bei negativen Zahlen: Math.floor(-3.5) ergibt -4 (rundet in Richtung -Infinity), während Math.trunc(-3.5) -3 ergibt (schneidet den Nachkommaanteil einfach ab). Weitere Rund- und Mathe-Hilfsfunktionen finden Sie im Kapitel JavaScript Math.
Zahlen formatieren: toFixed und toPrecision
Wenn Sie eine Zahl als string mit einer festen Form benötigen – für Geldbeträge, Prozentsätze, Berichte – verwenden Sie diese anstelle von Math.round:
toFixed(digits)behält eine feste Anzahl von Stellen nach dem Dezimalpunkt.toPrecision(digits)behält eine feste Anzahl signifikanter Stellen.
Beide geben strings zurück. Umschließen Sie das Ergebnis mit Number(), wenn Sie die Zahl zurückbenötigen. toLocaleString() ist die erste Wahl für Tausendertrennzeichen und Währungsformatierung in der Sprache des Benutzers.
Umgang mit ungenauen Berechnungen
Da der number-Typ binäre Gleitkommazahlen verwendet, können manche Dezimalbrüche nicht exakt gespeichert werden – das bekannte 0.1 + 0.2 !== 0.3. Dies ist kein JavaScript-Fehler; jede IEEE-754-Sprache hat dieses Problem.
Die Faustregel: Vergleichen Sie Gleitkommaergebnisse niemals mit ===. Runden Sie entweder beide Seiten zuerst, oder prüfen Sie, ob die Differenz kleiner als Number.EPSILON ist (der kleinste Abstand zwischen 1 und der nächsten darstellbaren Zahl).
Sichere Ganzzahlen
Ein number kann Ganzzahlen nur bis zu Number.MAX_SAFE_INTEGER (2^53 − 1) exakt speichern. Darüber hinaus können zwei verschiedene Ganzzahlen zum selben Wert werden:
Wenn Sie mit IDs, Zeitstempeln in Nanosekunden oder großen Zählern arbeiten, die diesen Grenzwert überschreiten, wechseln Sie zu BigInt.
Besondere numerische Werte
Infinity, -Infinity und NaN in JavaScript verstehen:
- Infinity: Steht für die Unendlichkeit, einen Wert, der größer als jede andere Zahl ist. Dieses Ergebnis erhalten Sie, wenn Sie eine Zahl durch null dividieren oder den oberen Grenzwert der Gleitkommazahlen überschreiten.
- -Infinity: Steht für negative Unendlichkeit, einen Wert, der kleiner als jede andere Zahl ist. Dies tritt auf, wenn Sie eine negative Zahl durch null dividieren oder den unteren Grenzwert der Gleitkommazahlen unterschreiten.
- NaN: Steht für „Not-a-Number". Dieser Wert entsteht bei einer undefinierten oder nicht darstellbaren mathematischen Operation, wie der Division von null durch null.
Die Methoden isNaN() und isFinite() zur Überprüfung dieser Sonderwerte:
isNaN(): Prüft, ob ein WertNaNist. Beachten Sie, dass das globaleisNaN()eine implizite Typumwandlung durchführt, sodassisNaN('hello')truezurückgibt. Für eine strikte Typprüfung verwenden SieNumber.isNaN(), das nur danntruezurückgibt, wenn der Wert tatsächlichNaNist.isFinite(): Prüft, ob ein Wert eine endliche Zahl ist, und gibtfalsefürInfinity,-InfinityoderNaNzurück.
Beispiele:
isNaN('hello')gibttruezurück, weil der string zuNaNumgewandelt wird.isFinite(2 / 0)gibtfalsezurück, da2 / 0zuInfinityführt, was nicht endlich ist.
Numerische Konvertierung: Number(), parseInt und parseFloat
Es gibt drei gängige Möglichkeiten, einen string in eine Zahl umzuwandeln – die richtige Wahl ist entscheidend.
Number(value) ist streng: Der gesamte string muss eine gültige Zahl sein (Leerzeichen werden abgeschnitten), andernfalls erhalten Sie NaN. Ein leerer string wird zu 0.
parseInt(value, radix) ist nachsichtig: Es liest von links und stoppt beim ersten Zeichen, das nicht Teil einer Ganzzahl ist. Wenn das erste Zeichen nicht geparst werden kann, gibt es NaN zurück. Übergeben Sie immer den radix (die Basis), um Überraschungen zu vermeiden.
parseFloat(value) funktioniert wie parseInt, versteht aber den Dezimalpunkt und liest, bis es auf ein Zeichen trifft, das nicht Teil einer Gleitkommazahl ist:
Faustregel: Verwenden Sie Number(), wenn der string vollständig numerisch sein sollte (z. B. bei der Validierung von Formulareingaben), und parseInt/parseFloat, wenn Sie eine Zahl aus Text wie '100px' extrahieren müssen.
Fazit
JavaScript speichert alle alltäglichen Zahlen als 64-Bit-Gleitkommazahlen, was Rundungsungenauigkeiten, das Limit für sichere Ganzzahlen und den Bedarf an sorgfältiger Formatierung und Vergleichslogik erklärt. Zu wissen, wann man auf toFixed, Number.EPSILON, BigInt oder parseInt zurückgreift, ermöglicht vorhersehbaren Code. Lesen Sie weiter in den verwandten Typ-Leitfäden: Strings, BigInt, das Math-Objekt und Datentypen.