1.1+0.1=1.2じゃないかも?

こんにちは。 

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に変換して使ってもいいです。