JavaScriptで小数点計算の誤差 | bignumber.jsを使おう

JavaScriptでの計算誤差

JavaScriptで以下の小数点計算をすると、誤差がでる。

0.1 + 0.2; // 0.30000000000000004

なぜ、こんな簡単な計算がずれるのだろうか?

実は計算する時に、いったん2進数に変換してから計算しているためだ。

小数点は、どうやって2進数にするのか?

数字の「小数」部分を次々に2倍していき、その結果を下に書いていく

出てきた数字の「整数」部分を上から並べたものが、求めたい2進数になっている

0.1であればこうなる。

0.1
0.2
0.4
0.8
1.6
1.2
0.4
0.8
.
.
.

00001100…

0.2であればこうなる。

0.2
0.4
0.8
1.6
1.2
0.4
0.8
1.6
.
.
.

00011001…

ほとんどの場合「小数」部分の計算は無限に続き、循環小数になってしまう。

これらを変数の型に格納するには、適当な桁で丸める必要があり、
例えば0.1が結果として「0.10000000000000000555{中略}625」となってしまうのだ。

この状態で0.1+0.2を計算しても、0.3にはならないだろう。

bignumber.js

こんな時、役に立つのがbignumber.jsである。

bignumber.js
https://github.com/MikeMcl/bignumber.js/

このように書くことで、小数点の計算も誤差なく行ってくれる。

x = new BigNumber(0.1)
x.plus(0.2) // “0.3”