だるろぐ

明日できることは、今日しない。

C# も神だった! (もちろん、WebMatrix も神)

0.1を10回足してみた。

  • PHPでの結果、1
  • JavaScriptでの結果、 0.9999999999999999
  • Pythonでの結果、0.9999999999999999
  • Rubyでの結果、1.0
  • Haskellでの結果0.9999999999999999

結論、PHPは神、その次、Ruby

0.1を10回足してみた結果PHPが神と言う事が判明しました | WhiteHackerzBlog ハッカー養成学院 公式ブログ

何がいいたいのかよくわかんないのだけど、とりあえず C# で試してみた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
            Console.ReadKey();
        }
    }
}

f:id:daruyanagi:20121031193448p:plain

結論、C# も神

おまけ

f:id:daruyanagi:20121031193649p:plainf:id:daruyanagi:20121031193833p:plain

もちろん、WebMatrix も神だ。

おまけ2

個人的には Ruby が一番偉い気がする。

おまけ3

1 = 0.9999999999999999…

で合ってるよね? わしは文系だからよくわかんないけど。

おまけ4

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(
               "{0:0.0}",
               0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);
            Console.ReadKey();
        }
    }
}

これだと 1.0 と出力されるのがご存じのとおり。

追記

もともと内部表現ではなく出力に着目するのががおかしいなぁ、という問題意識でこのエントリーは書いたので「C# が神!」というのはほとんど冗談なのだけど、decimal じゃないとダメというくだりは気になったので試してみた。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine((decimal)(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1));
            Console.ReadKey();
        }
    }
}

f:id:daruyanagi:20121031213411p:plain

ちゃんと 1.0 になった(@@;

decimal でキャストせずに 1.0m *1を足した場合でも、結果は一緒だった。

*1:m は decimal として扱うためのサフィックス