2019/04/10
プログラミングで小数の計算がちょっとおかしいところ
小数の計算は実は簡単とは言えません。
これはコンピューターの計算が10進数ではなくて、2進数のわけです。
10進数→2進数
例 0.1 を2進数にすると
(1) 0.1 x 2 = 0.2 整数は 0 → 0.0
(2) 0.2 x 2 = 0.4 整数は 0 → 0.00
(3) 0.4 x 2 = 0.8 整数は 0 → 0.000
(4) 0.8 x 2 = 1.6 整数は 1 → 0.0001
(5) 0.6 x 2 = 0.2 整数は 1 → 0.00011
(6) 0.2 x 2 = 0.4 整数は 0 → 0.000110
(7) 0.4 x 2 = 0.8 整数は 0 → 0.0001100
(8) 0.8 x 2 = 1.6 整数は 1 → 0.00011001
(9) 0.6 x 2 = 1.2 整数は 1 → 0.000110011
結果は0.000110011…と無限循環小数になる
計算誤差が起きる
1 2 | var tmp = 0.2 + 0.4; console.log("0.2 + 0.4 = " + tmp); |
0.2 + 0.4 = 0.6000000000000001
どうすればいいか
使う言語によって、ライブラリがあるはずです。
金額周りに関する精度が大事なので、
できれば、整数で計算にましょう。
ちなみに、自分の対応方法は下記です。
(1) 小数点桁数を決める。この小数と10の桁数乗をかける
(2) 一度小数になったら、精度が失うので、小数点以下は捨てて、整数とする
(3) 計算
(4) 結果は10の桁数乗を割る(この時も精度が失うが)
Author Profile
スターフィールド編集部
SHARE