JavaScript 0.1 + 0.2 === 0.3 はなぜfalseと評価されるのか [30seconds of interviews]

0.1 + 0.2 === 0.3 // false

一見trueになるように見えるが結果はfalseになる。

これはJavaScriptIEEE 754*1を採用し、64ビット浮動小数点数を使用するためである。 要するに、コンピュータは2進数ベースで動いているため10進数の少数を計算する場合、正しく2進数に変換できず誤差を生じてしまう。

0.1 + 0.2 // 0.30000000000000004

この問題の解決方法として、2つの値の差が定義した誤差マージン epsilon*2 より小さいかどうかを判定する関数を使う。

const approxEqual = (n1, n2, epsilon = 0.0001) => Math.abs(n1 - n2) < epsilon
approxEqual(0.1 + 0.2, 0.3) // true

30secondsofinterviews.org

*1:https://ja.wikipedia.org/wiki/IEEE_754

*2:非常に小さな数の意