STERFIELD

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…と無限循環小数になる

計算誤差が起きる

0.2 + 0.4 = 0.6000000000000001

どうすればいいか

使う言語によって、ライブラリがあるはずです。

金額周りに関する精度が大事なので、
できれば、整数で計算にましょう。

ちなみに、自分の対応方法は下記です。
(1) 小数点桁数を決める。この小数と10の桁数乗をかける
(2) 一度小数になったら、精度が失うので、小数点以下は捨てて、整数とする
(3) 計算
(4) 結果は10の桁数乗を割る(この時も精度が失うが)

Author Profile

著者近影

スターフィールド編集部

SHARE

合わせて読みたい