数値計算で型による誤差
2進数と10進数では内部の数値の扱い型が違います
これを認識していないと思わぬバグを生むことがあります
サンプル
次のコードを見てください
var price1 = 0.1 + 0.1 + 0.1;
var price2 = 0.1m + 0.1m + 0.1m;
Console.WriteLine(price1);
Console.WriteLine(price2);
このコードは、浮動小数点数と十進数の計算の違いを示しています。この違いは、数値を表現する際の精度と内部表現に関連しています。具体的には、price1 と price2 の計算と出力を行っていますが、それぞれ異なる数値型を使用しています。
var price1 = 0.1 + 0.1 + 0.1;:- ここで使用されている
0.1は、通常の浮動小数点リテラルです。これはdouble型(倍精度浮動小数点数)で扱われます。 - 浮動小数点数は、二進数で近似値を表現します。これは一部の値(特に10進数の小数)が正確に表現できないことを意味します。その結果、
0.1 + 0.1 + 0.1の計算は0.3にならず、非常に近い値になりますが、正確な0.3ではありません。 Console.WriteLine(price1);はこの近似値を出力します。
- ここで使用されている
var price2 = 0.1m + 0.1m + 0.1m;:- ここで使用されている
0.1mは、十進数リテラルです。mサフィックスは、数値がdecimal型(十進数)であることを示します。 decimal型は、金融計算など精度が重要な場面で使用され、より高い精度で10進数の値を表現できます。0.1m + 0.1m + 0.1mの計算は、正確に0.3となります。Console.WriteLine(price2);はこの正確な値を出力します。
- ここで使用されている
結果として、このコードは浮動小数点数(double)と十進数(decimal)の扱いの違いを明確に示しており、特に金融計算においては decimal 型が好ましいことを示唆しています。price1 の出力は 0.3 に非常に近い値になりますが、price2 の出力は正確に 0.3 になります。
参考
訪問数 16 回, 今日の訪問数 1回







ディスカッション
コメント一覧
まだ、コメントがありません