Number.EPSILON
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit September 2015 browserübergreifend verfügbar.
Die statische Dateneigenschaft Number.EPSILON gibt die Differenz zwischen 1 und der kleinsten Gleitkommazahl an, 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 die Differenz zwischen 1 und der nächstgrößeren Zahl, die im Number-Format darstellbar ist. Das liegt daran, dass das Gleitkommaformat mit doppelter Genauigkeit nur 52 Bit für die Darstellung der Mantisse verwendet und das niederwertigste Bit einen Stellenwert von 2-52 hat.
Beachten Sie, dass die absolute Genauigkeit von Gleitkommazahlen mit zunehmender Größe der Zahl abnimmt, weil der Exponent wächst, während die Genauigkeit der Mantisse gleich bleibt. Number.MIN_VALUE ist die kleinste darstellbare positive Zahl und deutlich kleiner als Number.EPSILON.
Da EPSILON eine statische Eigenschaft von Number ist, verwenden Sie sie immer als Number.EPSILON und nicht als Eigenschaft eines Zahlenwerts.
Beispiele
>Gleichheit prüfen
Jedes System zur Darstellung von Zahlen, das eine endliche Anzahl von Bits verwendet, kann unabhängig von der gewählten Basis (z. B. dezimal oder binär) zwangsläufig nicht alle Zahlen exakt darstellen. Schließlich wird versucht, unendlich viele Punkte auf der Zahlengeraden mit einer endlichen Menge an Speicher darzustellen. Beispielsweise kann ein System zur Basis 10 (Dezimalsystem) 1/3 nicht exakt darstellen, und ein System zur Basis 2 (Binärsystem) kann 0.1 nicht exakt darstellen. Daher ist beispielsweise 0.1 + 0.2 nicht exakt gleich 0.3:
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
Aus diesem Grund wird häufig empfohlen, Gleitkommazahlen niemals mit === zu vergleichen. Stattdessen können zwei Zahlen als gleich betrachtet werden, wenn sie nahe genug beieinanderliegen. Die Konstante Number.EPSILON ist in der Regel ein geeigneter Schwellenwert für Abweichungen, wenn sich die Berechnungen in der Größenordnung von 1 bewegen. Denn EPSILON gibt im Wesentlichen an, mit welcher Genauigkeit die Zahl „1“ dargestellt wird.
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
Für Berechnungen mit Zahlen in einer größeren Größenordnung ist Number.EPSILON jedoch ungeeignet. Wenn Ihre Daten in der Größenordnung von 103 liegen, ist die Genauigkeit des Dezimalteils deutlich geringer als Number.EPSILON:
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 verglichenen Zahlen ungefähr die Größenordnung 2000 haben, ergibt ein Faktor wie 2000 * Number.EPSILON für diesen Fall eine ausreichende Toleranz.
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
Neben der Größenordnung sollten Sie auch die Genauigkeit Ihrer Eingabedaten berücksichtigen. Wenn die Zahlen beispielsweise aus einem Formulareingabefeld stammen und sich der Eingabewert nur in Schritten von 0.1 ändern lässt (d.h. <input type="number" step="0.1">), ist es in der Regel sinnvoll, eine deutlich größere Toleranz wie 0.01 zuzulassen, da die Daten nur eine Genauigkeit von 0.1 haben.
Hinweis:
Wichtig: Verwenden Sie Number.EPSILON nicht pauschal als Schwellenwert für Gleichheitsprüfungen. Wählen Sie einen Schwellenwert, der zur Größenordnung und Genauigkeit der verglichenen Zahlen passt.
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-number.epsilon> |