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
stellt den Unterschied zwischen 1 und der kleinsten Gleitkommazahl dar, die größer als 1 ist.
Probieren Sie es aus
Wert
2-52, oder ungefähr 2.2204460492503130808472633361816E-16
.
Eigenschaften der Number.EPSILON -Property |
|
---|---|
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, da das Double-Precision-Gleitkommaformat nur 52 Bits zum Repräsentieren der Mantisse hat und das niederwertigste Bit eine Bedeutung von 2-52 besitzt.
Beachten Sie, dass die absolute Genauigkeit von Gleitkommazahlen abnimmt, je größer das Zahl wird, denn der Exponent wächst, 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 sie immer als Number.EPSILON
und nicht als Eigenschaft eines Zahlenwerts.
Beispiele
Gleichheit testen
Jedes Zahlencodierungssystem, das eine endliche Anzahl von Bits, in welcher Basis auch immer (z.B. dezimal oder binär), verwendet, kann notwendigerweise nicht alle Zahlen exakt darstellen, weil Sie versuchen, eine unendliche Anzahl von Punkten auf der Zahlenlinie mit einer endlichen Menge Speicher darzustellen. Zum Beispiel kann ein Dezimalsystem (Basis 10) nicht 1/3 exakt darstellen und ein Binärsystem (Basis 2) kann 0.1
nicht exakt darstellen. Daher ist beispielsweise 0.1 + 0.2
nicht genau 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, keine Gleitkommazahlen mit ===
zu vergleichen. Stattdessen können wir zwei Zahlen als gleich erachten, wenn sie nahe genug beieinander liegen. Die Konstante Number.EPSILON
ist normalerweise eine angemessene Schwelle für Fehler, wenn die Arithmetik im Bereich der Größenordnung von 1
liegt, da EPSILON
im Wesentlichen festlegt, 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
für jegliche Arithmetik mit größerer Größenordnung ungeeignet. Wenn Ihre Daten in der Größenordnung 103 sind, hat der Dezimalteil eine viel geringere Genauigkeit 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, schafft 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
Zusätzlich zur Größenordnung ist es wichtig, die Genauigkeit Ihrer Eingaben zu berücksichtigen. Wenn die Zahlen beispielsweise aus einem Formulareingabefeld erfasst werden und der Eingabewert nur in Schritten von 0.1
angepasst werden kann (d.h. <input type="number" step="0.1">
), ist es normalerweise sinnvoll, 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 Schwelle für Gleichheitstests. Verwenden Sie eine Schwelle, die für die Größenordnung und Genauigkeit der zu vergleichenden Zahlen geeignet ist.
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-number.epsilon |
Browser-Kompatibilität
BCD tables only load in the browser