Number.EPSILON
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Die statische Dateneigenschaft Number.EPSILON
repräsentiert den Unterschied zwischen 1 und der kleinsten Gleitkommazahl, die größer als 1 ist.
Probieren Sie es aus
const result = Math.abs(0.2 - 0.3 + 0.1);
console.log(result);
// Expected output: 2.7755575615628914e-17
console.log(result < Number.EPSILON);
// Expected output: true
Wert
2-52, oder ungefähr 2.2204460492503130808472633361816E-16
.
Eigenschaften von Number.EPSILON | |
---|---|
Schreibbar | nein |
Aufzählbar | nein |
Konfigurierbar | nein |
Beschreibung
Number.EPSILON
ist der Unterschied zwischen 1 und der nächstgrößeren Zahl, die im Number-Format darstellbar ist, weil das Double-Precision-Gleitkommaformat nur 52 Bits zur Darstellung der Mantisse hat und das niedrigste Bit eine Signifikanz von 2-52 hat.
Beachten Sie, dass die absolute Genauigkeit von Gleitkommazahlen abnimmt, wenn die Zahl größer wird, da sich der Exponent vergrößert, während die Genauigkeit der Mantisse gleich bleibt. Number.MIN_VALUE
ist die kleinste darstellbare positive Zahl, die viel kleiner ist als Number.EPSILON
.
Da EPSILON
eine statische Eigenschaft von Number
ist, verwenden Sie es immer als Number.EPSILON
und nicht als Eigenschaft eines Zahlenwertes.
Beispiele
Gleichheit testen
Jedes Zahlencodierungssystem, das eine endliche Anzahl von Bits verwendet, unabhängig von der Basis (z.B. Dezimal oder Binär), wird notwendigerweise nicht in der Lage sein, alle Zahlen genau darzustellen, da versucht wird, eine unendliche Anzahl von Punkten auf der Zahlenlinie mit einer begrenzten Menge an Speicher darzustellen. Zum Beispiel kann ein System zur Basis 10 (Dezimal) 1/3 nicht genau darstellen und ein System zur Basis 2 (Binär) kann 0.1
nicht genau darstellen. Daher ist zum Beispiel 0.1 + 0.2
nicht genau gleich 0.3
:
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
Aus diesem Grund wird oft geraten, dass Gleitkommazahlen niemals mit ===
verglichen werden sollten. Stattdessen können wir zwei Zahlen als gleich betrachten, wenn sie nahe genug beieinander liegen. Die Konstante Number.EPSILON
ist normalerweise eine vernünftige Schwelle für Fehler, wenn die Arithmetik um die Größenordnung von 1
liegt, da EPSILON
im Wesentlichen angibt, wie genau die Zahl "1" ist.
function equal(x, y) {
return Math.abs(x - y) < Number.EPSILON;
}
const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
Allerdings ist Number.EPSILON
ungeeignet für jede Arithmetik auf einer größeren Größenordnung. Wenn Ihre Daten in der Größenordnung von 103 liegen, wird der Dezimalteil eine viel kleinere Genauigkeit als Number.EPSILON
aufweisen:
function equal(x, y) {
return Math.abs(x - y) < Number.EPSILON;
}
const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002; error of 10^-13 instead of 10^-16
console.log(equal(x + y, z)); // false
In diesem Fall ist eine größere Toleranz erforderlich. Da die zu vergleichenden Zahlen eine Größenordnung von ungefähr 2000
haben, erzeugt ein Multiplikator wie 2000 * Number.EPSILON
genug Toleranz für diesen Fall.
function equal(x, y, tolerance = Number.EPSILON) {
return Math.abs(x - y) < tolerance;
}
const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(equal(x + y, z, 2000 * Number.EPSILON)); // true
Zusätzlich zur Größenordnung ist es wichtig, die Genauigkeit Ihrer Eingaben zu berücksichtigen. Zum Beispiel, wenn die Zahlen von einer Formulareingabe gesammelt werden und der Eingabewert nur in Schritten von 0.1
angepasst werden kann (d.h. <input type="number" step="0.1">
), macht es normalerweise Sinn, eine viel größere Toleranz zuzulassen, wie 0.01
, da die Daten nur eine Präzision von 0.1
haben.
Hinweis:
Wichtige Erkenntnis: Verwenden Sie Number.EPSILON
nicht einfach als Schwelle für Gleichheitstests. Verwenden Sie eine Schwelle, die für die Größenordnung und Genauigkeit der Zahlen, die Sie vergleichen, geeignet ist.
Spezifikationen
Specification |
---|
ECMAScript® 2026 Language Specification # sec-number.epsilon |