Number.EPSILON
Number.EPSILON 靜態資料屬性表示 1 與大於 1 的最小浮點數之間的差值。
試一試
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
值
2-52,或約等於 2.2204460492503130808472633361816E-16。
Number.EPSILON 的屬性特性 | |
|---|---|
| 可寫 | 否 |
| 可列舉 | 否 |
| 可配置 | 否 |
描述
Number.EPSILON 是 1 與 Number 格式中下一個可表示數之間的差值,因為 雙精度浮點格式 只有 52 位來表示 尾數,而最低位具有 2-52 的權重。
請注意,隨著數值增大,浮點數的絕對精度會降低,因為指數增長而尾數的精度保持不變。Number.MIN_VALUE 是最小的可表示正數,它遠小於 Number.EPSILON。
由於 EPSILON 是 Number 的靜態屬性,您始終使用 Number.EPSILON 來訪問它,而不是作為數字值的屬性。
示例
相等性測試
任何佔用有限位數(無論您選擇哪種基數,例如十進位制或二進位制)的數字編碼系統,都必然無法精確表示所有數字,因為您試圖使用有限的記憶體來表示數軸上的無限多個點。例如,基數為 10(十進位制)的系統無法精確表示 1/3,而基數為 2(二進位制)的系統無法精確表示 0.1。因此,例如,0.1 + 0.2 不會精確等於 0.3。
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
出於這個原因,通常建議不要使用 === 來比較浮點數。相反,如果兩個數字足夠接近,我們可以認為它們是相等的。當算術運算的幅度接近 1 時,Number.EPSILON 常量通常是一個合理的誤差閾值,因為 EPSILON 本質上指定了數字“1”的精度。
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
然而,對於任何以更大數量級進行的算術運算,Number.EPSILON 都是不合適的。如果您的資料量級在 103,則小數部分的精度將遠小於 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
在這種情況下,需要更大的容差。由於比較的數字幅度約為 2000,因此像 2000 * Number.EPSILON 這樣的乘數會為此例項建立足夠的容差。
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
除了幅度之外,考慮輸入的精度也很重要。例如,如果數字是從表單輸入收集的,並且輸入值只能以 0.1 的步長進行調整(例如 <input type="number" step="0.1">),則通常允許更大的容差是有意義的,例如 0.01,因為資料只有 0.1 的精度。
注意:重要提示:不要簡單地將 Number.EPSILON 用作相等性測試的閾值。應使用適合您所比較數字的幅度與精度的閾值。
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-number.epsilon |
瀏覽器相容性
載入中…