こんにちは。
ERP事業部大阪開発のキムです。
C#で開発している際、小数点の計算で誤差が発生するということを知りました。
1.1+0.1の値は1.2のはずなのに、1.2000000000000002が出力されています。
理由
これはC#だけで発生する問題ではなく、すべての言語でほぼ共通して発生する問題です。
理由は、コンピュータは数字を2進数で受け取るので発生する問題です。
2進数の整数部分は以下のように表現します。
1 = 2^0 = 1(2) = 1
1*2 = 2^1 = 10(2) = 2
1*2*2 = 2^2 = 100(2) = 4
…
2ずつ掛ける規則があります。
2進数の素数部分は以下のように表現します。
1/2 = 2^-1 = 0.1(2) = 1/2 = 0.5
(1/2)/2 = 2^-2 = 0.01(2) = 1/4 = 0.25
((1/2)/2)/2 = 2^-3 = 0.001(2) = 1/8 = 0.125
…
2ずつ割る規則があります。
それなら0.75のような数は2進数で0.11(2)のように簡単に分けられますが、0.3のような数はどうなると思いますか?
0.3=0.0100110011……(無限ループ)(2)になります。
コンピュータのメモリにも限界がありますので、結局コンピュータはこの無限ループされる値の近似値を保存します。
ここで誤差が生じるのです。
float型(C#やそのような言語ではdoubleのように少数を保存できるタイプも含め)同士の保存または演算では正確な計算が行われていないです。。
1.decimal資料型を使うことだ。 (C#ではこの方法をオススメ)
もとのコードに影響なく変更するには以下の方法がいいと思います。
2.double型をToString()して再びdoubleに変換して使ってもいいです。