C#で0.1を100回足してみた
エンジニア歴が1年になり、プログラムを基礎から学んでいます。
本を読んでいて、0.1を100回足しても10にならないという文を発見、実験してみました。私は、意識したことがなかったし、全く知りませんでした。
以下を作成。シンプルに0.1を100回足して、表示するというプログラム。
using System;
namespace _0._1Add_100
{
internal class Program
{
static void Main(string[] args)
{
double sum = 0;
for (int i = 0; i < 100; i++) {
sum += 0.1;
}
Console.WriteLine(sum);
}
}
}
結果が以下。
確かに10にならない。困るね。
理由は10進数の0.1を2進数に正確に変換できず、近似値で計算してしまうから。
2進数を扱うことを意識していないと計算を間違ってしまう。C#のdecimal型は10進数で計算するので、こんなことにはならないだろうという仮説をたて、以下のコードを実施。
using System;
namespace _0._1Add_100
{
internal class Program
{
static void Main(string[] args)
{
double a = 0.1;
decimal sum = 0;
for (int i = 0; i < 100; i++)
{
sum += (decimal)a;
}
Console.WriteLine(sum);
}
}
}
以下、結果。
decimal型は10進数を扱うので、最初のような計算を間違えることはない。
2進数を意識しないと怖い感じた。実験でした。
最後まで読んでいただきありがとうございます。記事を読んで何か感じたり、思ったりしていただけたら、’すき’していただけたら幸いです。