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(); } } }
結論、C# も神。
おまけ
もちろん、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 と出力されるのがご存じのとおり。
追記
URL これ、表示の際に丸目てるか切り捨ててるかだけの差のはず。C# も0.1を10回足したらバイナリ的には 3FEFFFFFFFFFFFFF。浮動小数点数の仕様。decimal使わないと。
もともと内部表現ではなく出力に着目するのががおかしいなぁ、という問題意識でこのエントリーは書いたので「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(); } } }
ちゃんと 1.0 になった(@@;
decimal でキャストせずに 1.0m *1を足した場合でも、結果は一緒だった。
*1:m は decimal として扱うためのサフィックス