C#では小数点以下の数値を扱う場合、浮動小数点型と呼ばれる float型 または double型 を使用します
float型 と double型 の違いですが、double型の方が有効桁数が多く、精度が良いので通常はこちらを使用します
float型 はデータ量が少ないので画像処理など大量の計算を行う場合に使用されることがあります
class Program { static void Main(string[] args) { double x = 0.1; double y = 0.1; double z = x + y; Console.WriteLine("z = {0}", z); Console.ReadKey(); } }
開始してプログラムを実行すると、正しく z = 0.2 と結果が表示されました
開始してプログラムを実行すると、正しく z = 0.2 と結果が表示されました
float x = 0.1;
すると 0.1 の部分に赤い波線でエラーメッセージが表示されました
リテラル とは 0.1 のようにプログラムの中に直接記述した値のことを指しています
つまり、0.1というリテラルは double型 なので float型 の変数に代入することができないということです
'F'サフィックスを使用して…とありますが、ようするに 0.1F と記述しろという意味です
float x = 0.1F;
浮動小数点とは簡単に説明すると 1.1011x2の12乗 というような形でデータを保持しています
その為、非常に大きな値から、非常に小さな値まで表現できますが、誤差が問題になることがあります
WriteLineの{0}の部分を{0:G17}に書き換えることで 変数z の中身をより詳細に出力させることができます
Console.WriteLine("z = {0:G17}", z);
これは難しい話になるのですが、0.2が2進数では無理数(0.00110011...)であることが原因です
浮動小数点にはこのような小さな誤差が常に存在することを覚えておきましょう
つぎにプログラムを書き換えて、大きな数字に小さな数字を足してみます
x を 1000000000 y を 0.0000001 に書き換えてみます
double x = 1000000000; double y = 0.0000001;
double x = 10000000000; double y = 0.0000001;
すると結果は大きな数字だけになり小さな数字は足されていないことになってしまいました