0.1 + 0.2 === 0.3 // false
一見true
になるように見えるが結果はfalse
になる。
これはJavaScriptがIEEE 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
*1:https://ja.wikipedia.org/wiki/IEEE_754
*2:非常に小さな数の意