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.

Number.EPSILON プロパティは、1 と 1 より大きな最小の浮動小数点数の差を表します。

試してみましょう

2-52、またはおよそ 2.2204460492503130808472633361816E-16

Number.EPSILON のプロパティ属性
書込可能不可
列挙可能不可
設定可能不可

解説

Number.EPSILON は、1 と数値形式で表現できる次に大きな数値との差です。これは、倍精度浮動小数点数形式では仮数部を 52 ビットでしか表現できず、最低ビットは 2-52 で表されるためです。

なお、浮動小数点数の絶対精度は、数が大きくなるにつれ、指数が大きくなる一方で仮数部の精度は変わらないため、低下します。Number.MIN_VALUE は表現可能な正の数の最小値であり、Number.EPSILON よりもはるかに小さいものです

EPSILONNumber の静的プロパティなので、数値のプロパティとしてではなく、常に Number.EPSILON として使用しています。

同等性のテスト

10 進数や 2 進数など、どのような基数を選んでも、有限のビット数を占める数字エンコーディングシステムは、必然的にすべての数字を正確に表すことができません。なぜなら、有限のメモリーを使用して、数直線上の無限の点を表現しようとすることになるからです。例えば、10 進法では 1/3 を正確に表せませんし、2 進法では 0.1を正確に表せません。したがって、例えば、0.1 + 0.20.3 と正確に等しくはなりません。

js
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

このため、浮動小数点数で === と比較してはいけないというアドバイスがたくさんあります。その代わりに、異なる 2 種類の数値が十分に近い場合には、等しいとみなすことができます。EPSILONは、要するに 1 という数字がどの程度正確かを指定するものなので、演算結果が 1 程度の大きさであれば、通常 Number.EPSILON 定数がエラーに対する妥当な閾値となります。

js
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 よりもずっと小さな精度を持つことになります。

js
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 のような乗数で、この例では十分な許容範囲を作ることができます。

js
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.1 の精度しかないので通常は 0.01 など、はるかに大きな許容差を認めることを意味します。

メモ: 有益な教訓:等値検査の閾値として、単純に Number.EPSILON を使用しないでくださ い。比較する数値の大きさや精度に適した閾値を使用してください。

仕様書

Specification
ECMAScript Language Specification
# sec-number.epsilon

ブラウザーの互換性

BCD tables only load in the browser

関連情報