見出し画像

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);
        } 
    }
}

結果が以下。

0.1を100回足した結果

確かに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);
        } 
    }
}

以下、結果。

10になりました。

decimal型は10進数を扱うので、最初のような計算を間違えることはない。
2進数を意識しないと怖い感じた。実験でした。

最後まで読んでいただきありがとうございます。記事を読んで何か感じたり、思ったりしていただけたら、’すき’していただけたら幸いです。