JavaScript丸め誤差

JavaScript含めて、内部で2進数で計算しているコンピューターでは、小数を扱うとき、思わぬ誤差が出ます。

人間の感覚でいうと以下のような感じで、

1/3 * 3
→ 0.333333333… * 3
→ 0.999999999…(無限小数)

2進数の世界では以下のようなことが起きます。

(10進数)0.1 * 6
→ (2進数)0.000110011001100… * 110 (2進数では無限小数)
→ (10進数)0.6000000000000001

小数は近似値。消費税計算や比率など小数を扱うときは避けようがないので、注意しましょう。

Program

console.log(0.1 * 6); // 0.6000000000000001
console.log(1.001 - 1); // 0.0009999999999998899

Memo

2進数の整数は、1の位、2の位、4の位、8の位…2のn乗の位で表されます。

2進数の小数は、1/2の位、1/4の位、1/8の位…2の-n乗の位で表されます。

そして、1/2、1/4、1/8…の和で表現できないものは2進数の無限小数になります。

例)0.5 = 1/2 → 2進数では 0.1

例)0.01 = 1/100
→ 0/2 + 0/4 + 0/8 + 1/16 + 1/32 + 0/64 + …
→ 0.000110…
(分母が5の倍数だと2進数の小数の有限桁で表せない)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です