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 darstellbaren Zahl im Number-Format, da das Double-Precision-Gleitkommaformat nur 52 Bits zur Darstellung der Mantisse hat, und das niedrigste Bit eine Bedeutung von 2-52 hat.
Beachten Sie, dass die absolute Genauigkeit von Gleitkommazahlen abnimmt, je größer die Zahl wird, da der Exponent wächst, während die Genauigkeit der Mantisse gleich bleibt. Number.MIN_VALUE
ist die kleinste darstellbare positive Zahl, die viel kleiner als Number.EPSILON
ist.
Da EPSILON
eine statische Eigenschaft von Number
ist, wird sie immer als Number.EPSILON
verwendet, anstatt als eine Eigenschaft eines Zahlenwerts.
Beispiele
Testen von Gleichheit
Jedes Zahlencodierungssystem, das eine endliche Anzahl von Bits belegt, unabhängig von der gewählten Basis (z. B. Dezimal oder Binär), wird notwendigerweise nicht in der Lage sein, alle Zahlen genau darzustellen, weil Sie versuchen, eine unendliche Anzahl von Punkten auf der Zahlenlinie mit einer endlichen Menge an Speicher darzustellen. Zum Beispiel kann ein System der Basis 10 (Dezimal) 1/3 nicht genau darstellen, und ein System der 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, Gleitkommazahlen niemals mit ===
zu vergleichen. Stattdessen können zwei Zahlen als gleich betrachtet werden, wenn sie nahe genug beieinander liegen. Die Konstante Number.EPSILON
ist in der Regel ein angemessener Schwellenwert 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
Jedoch ist Number.EPSILON
ungeeignet für Arithmetik, die auf einer größeren Größenordnung operiert. Wenn Ihre Daten in der Größenordnung von 103 liegen, wird der Dezimalteil eine wesentlich geringere Genauigkeit haben 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 eine Größenordnung von ungefähr 2000
haben, erzeugt ein Multiplikator wie 2000 * Number.EPSILON
genügend 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
Neben der Größenordnung ist es wichtig, die Genauigkeit Ihrer Eingaben zu berücksichtigen. Wenn die Zahlen zum Beispiel aus einer Formulareingabe gesammelt werden und der Eingabewert nur in Schritten von 0.1
angepasst werden kann (d.h. <input type="number" step="0.1">
), ergibt es in der Regel Sinn, eine viel größere Toleranz, wie 0.01
, zuzulassen, da die Daten nur eine Genauigkeit von 0.1
haben.
Hinweis:
Wichtiger Hinweis: Verwenden Sie Number.EPSILON
nicht einfach als Schwellenwert für Gleichheitstests. Verwenden Sie einen Schwellenwert, der für die Größenordnung und Genauigkeit der Zahlen, die Sie vergleichen, angemessen ist.
Spezifikationen
Specification |
---|
ECMAScript® 2025 Language Specification # sec-number.epsilon |
Browser-Kompatibilität
BCD tables only load in the browser