Start · Sprachen · JavaScript · Referenz · Number.EPSILON

Number.EPSILON

Eigenschaft

Die statische Eigenschaft <code>Number.EPSILON</code> gibt den Abstand zwischen 1 und der nächstgrößeren darstellbaren Gleitkommazahl an (2<sup>-52</sup> ≈ 2,22e-16).

seit JavaScript ES2015 Kategorie: method-property

Signatur

Number.EPSILON

Beschreibung

Number.EPSILON ist eine konstante, statische Dateneigenschaft des Number-Objekts. Ihr Wert ist 2 ** -52, also etwa 2.220446049250313e-16. Das ist der Abstand zwischen 1 und der kleinsten Zahl im IEEE-754-Format mit doppelter Genauigkeit (64 Bit), die größer als 1 ist.

Gebraucht wird die Konstante vor allem, um Gleitkommazahlen mit einer Toleranz zu vergleichen. Weil viele Dezimalbrüche binär nicht exakt darstellbar sind, ergibt zum Beispiel 0.1 + 0.2 === 0.3 den Wert false. Statt auf exakte Gleichheit prüft man deshalb, ob der Betrag der Differenz kleiner als eine kleine Schranke ist. Number.EPSILON ist dafür ein üblicher Ausgangswert.

Wichtig: Number.EPSILON beschreibt die Genauigkeit in der Nähe von 1. Bei größeren Beträgen wird der Abstand zwischen benachbarten Gleitkommazahlen größer, bei kleineren kleiner. Für robuste Vergleiche sollte man die Toleranz deshalb relativ zur Größe der verglichenen Werte skalieren.

Die Eigenschaft ist weder beschreibbar noch aufzählbar noch konfigurierbar. Sie wird immer als Number.EPSILON aufgerufen und nicht über eine Zahleninstanz.

Rückgabewert

Typ
number
Beschreibung
Der konstante Wert 2 ** -52 (≈ 2.220446049250313e-16).

Beispiele

Wert und Herleitung

console.log(Number.EPSILON);
console.log(Number.EPSILON === 2 ** -52);
// Nächste darstellbare Zahl nach 1
console.log(1 + Number.EPSILON > 1);
console.log(1 + Number.EPSILON / 2 === 1);
2.220446049250313e-16 true true true

Gleitkommazahlen mit Toleranz vergleichen

const nearlyEqual = (a, b) => Math.abs(a - b) < Number.EPSILON;

console.log(0.1 + 0.2 === 0.3);
console.log(nearlyEqual(0.1 + 0.2, 0.3));
false true

Relative Toleranz für große Werte

// Absolute Toleranz scheitert bei großen Zahlen
const absEqual = (a, b) => Math.abs(a - b) < Number.EPSILON;

// Relative Toleranz skaliert mit der Größe der Werte
const relEqual = (a, b, factor = 4) =>
  Math.abs(a - b) <= Number.EPSILON * factor * Math.max(Math.abs(a), Math.abs(b), 1);

const a = 1000.1 + 1000.2; // 2000.3000000000002
const b = 2000.3;
console.log(absEqual(a, b));
console.log(relEqual(a, b));
false true

Beträge in einer Warenkorb-Summe runden

// Kaufmännisch auf 2 Nachkommastellen runden, auch bei Werten wie 1.005
const roundTo2 = (value) => Math.round((value + Number.EPSILON) * 100) / 100;

console.log(Math.round(1.005 * 100) / 100);
console.log(roundTo2(1.005));
console.log(roundTo2(19.99 + 5.01));
1 1.01 25

// Wichtig · Fallstricke

  • Keine universelle Toleranz: Number.EPSILON gilt nur für Werte um 1. Bei Werten ab etwa 2 ist schon der Abstand zwischen benachbarten Zahlen größer als Number.EPSILON. Ein Vergleich mit Math.abs(a - b) < Number.EPSILON ist dann faktisch eine Prüfung auf exakte Gleichheit. Deshalb besser eine relative Toleranz verwenden.
  • Fehler summieren sich: Nach vielen Rechenschritten kann die Abweichung ein Vielfaches von Number.EPSILON betragen. Wählen Sie die Toleranz passend zum Anwendungsfall, etwa 1e-9 bei Messwerten.
  • Nicht verwechseln mit Number.MIN_VALUE: Number.MIN_VALUE (≈ 5e-324) ist die kleinste positive darstellbare Zahl. Number.EPSILON ist dagegen ein Maß für die relative Genauigkeit.
  • Geldbeträge: Der Trick value + Number.EPSILON beim Runden hilft nur in Randfällen. Für Finanzberechnungen sollten Sie besser mit ganzzahligen Cent-Beträgen oder BigInt rechnen.
  • Kompatibilität: Die Eigenschaft ist seit ES2015 in allen modernen Browsern und in Node.js verfügbar, aber nicht im Internet Explorer. Als Ersatz dort: Number.EPSILON ?? Math.pow(2, -52), in alter Syntax ohne ?? formuliert.