Start · Sprachen · JavaScript · Referenz · Number.isInteger()

Number.isInteger()

Methode

Die statische Methode <code>Number.isInteger()</code> prüft, ob der übergebene Wert eine ganze Zahl vom Typ <code>number</code> ist.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Number.isInteger(value)

Beschreibung

Number.isInteger() gibt true zurück, wenn der übergebene Wert vom Typ number und eine endliche ganze Zahl ist. In allen anderen Fällen ist das Ergebnis false, also bei NaN, Infinity, -Infinity, Kommazahlen und bei allen Werten, die keine Zahl sind (Strings, null, BigInt, Objekte).

Anders als ältere Prüfungen wie value % 1 === 0 oder Math.floor(value) === value findet keine Typumwandlung statt. Number.isInteger("5") ergibt deshalb false. Damit eignet sich die Methode gut, um Eingaben zu prüfen, etwa Array-Indizes, Seitenzahlen, Mengenangaben oder IDs aus JSON-Daten.

Die Methode prüft den gespeicherten Wert nach IEEE-754, nicht, wie das Literal im Quelltext aussieht. 5.0 ist eine ganze Zahl, und auch 5.0000000000000001 wird als 5 gespeichert und ergibt true. Oberhalb von Number.MAX_SAFE_INTEGER (253 − 1) ist jede darstellbare Zahl ganzzahlig, dort liefert die Methode also immer true. Das heißt aber nicht, dass mit diesen Werten exakt gerechnet werden kann. Dafür gibt es Number.isSafeInteger().

Parameter

Name Typ Default Beschreibung
$value Pflicht any Der zu prüfende Wert. Er wird nicht in eine Zahl umgewandelt.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn value vom Typ number, endlich und ganzzahlig ist, sonst false.

Beispiele

Grundlegende Prüfungen

console.log(Number.isInteger(42));        // true
console.log(Number.isInteger(-7));        // true
console.log(Number.isInteger(5.0));       // true
console.log(Number.isInteger(0.5));       // false
console.log(Number.isInteger(NaN));       // false
console.log(Number.isInteger(Infinity));  // false
console.log(Number.isInteger("10"));      // false – keine Typumwandlung
console.log(Number.isInteger(10n));       // false – BigInt ist kein number
console.log(Number.isInteger(null));      // false
true true true false false false false false false

Formulareingabe für eine Bestellmenge prüfen

const parseQuantity = (input) => {
  const n = Number(input.trim());
  if (!Number.isInteger(n) || n < 1) {
    throw new RangeError(`Ungültige Menge: "${input}"`);
  }
  return n;
};

console.log(parseQuantity(" 3 "));
try {
  parseQuantity("2.5");
} catch (err) {
  console.log(err.message);
}
3 Ungültige Menge: "2.5"

Grenzen der Genauigkeit: isInteger und isSafeInteger

console.log(Number.isInteger(5.0000000000000001));   // true – gespeichert als 5
console.log(Number.isInteger(2 ** 53 + 0.5));        // true – Nachkommastelle geht verloren
console.log(Number.isSafeInteger(2 ** 53));          // false – außerhalb des sicheren Bereichs
console.log(Number.isSafeInteger(Number.MAX_SAFE_INTEGER)); // true
true true false true

IDs in API-Daten filtern

const payload = [{ id: 1 }, { id: "2" }, { id: 3.7 }, { id: 4 }];

const validIds = payload
  .map(({ id }) => id)
  .filter(Number.isInteger);

console.log(validIds);
[1, 4]

// Wichtig · Fallstricke

  • Genauigkeit: Die Methode prüft den gespeicherten Gleitkommawert. Ergebnisse von Rechnungen wie 0.1 * 3 * 10 (3.0000000000000004) sind nicht ganzzahlig. Wenn du ganzzahlige Ergebnisse erwartest, runde vorher oder vergleiche mit einer Toleranz (Number.EPSILON).
  • Großer Wertebereich: Ab 253 gibt die Methode immer true zurück, obwohl dort nicht mehr exakt gerechnet werden kann. Für IDs, Zähler und Geldbeträge in Cent verwende Number.isSafeInteger(), für sehr große Werte BigInt.
  • Keine Typumwandlung: Strings aus Formularen oder URLs musst du erst mit Number() umwandeln. Vorsicht: Number("") und Number(" ") ergeben 0 und damit true. Leere Eingaben solltest du daher vorher abfangen.
  • Number.isInteger(-0) ergibt true.
  • Es gibt keine globale Funktion isInteger(), nur die statische Methode an Number.
  • Kompatibilität: Die Methode gehört seit ES2015 zum Standard und läuft in allen modernen Browsern und Node.js. Der Internet Explorer unterstützt sie nicht. Ein Polyfill ist zum Beispiel typeof v === "number" && isFinite(v) && Math.floor(v) === v.