Signatur
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
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);
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));
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));
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));
// Wichtig · Fallstricke
- Keine universelle Toleranz:
Number.EPSILONgilt nur für Werte um 1. Bei Werten ab etwa 2 ist schon der Abstand zwischen benachbarten Zahlen größer alsNumber.EPSILON. Ein Vergleich mitMath.abs(a - b) < Number.EPSILONist 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.EPSILONbetragen. Wählen Sie die Toleranz passend zum Anwendungsfall, etwa1e-9bei Messwerten. - Nicht verwechseln mit
Number.MIN_VALUE:Number.MIN_VALUE(≈ 5e-324) ist die kleinste positive darstellbare Zahl.Number.EPSILONist dagegen ein Maß für die relative Genauigkeit. - Geldbeträge: Der Trick
value + Number.EPSILONbeim Runden hilft nur in Randfällen. Für Finanzberechnungen sollten Sie besser mit ganzzahligen Cent-Beträgen oderBigIntrechnen. - 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.