在開發的時候,遇到一個問題,c#中定義一個double變量,當這個變量在很大的時候,讓這個變量加上或者減去一個較小的值不會改變其大小(這個其實與double變量的二進制存儲機制相關),就是說加上一個值以後的值.comPareTo(原來的值)返回0,就是說他們相等。c#
因而我想找到哪一個具體的值是在加上或者減去1時,值的改變能夠被檢測到的。因而有了如下代碼。spa
//由於至關大的範圍內都是能夠檢測到大小改變的,因此不從1開始,節約時間 double a = 10000000; double pre_a = 0; double b = 0; double c = 0; int c1 = 0; int c2 = 0; double addValue = 1; while (true) { pre_a = a; a += addValue; b = a + 1; c = b + 1; c1 = a.CompareTo(b) ; c2 = b.CompareTo(c); if ((c1 < 0) && (c2 == 0)) { //輸出最後結果 Console.WriteLine("a = " + a + " b = " + b + " c = " + c); break; } if ((c1 < 0) && (c2 < 0)) { addValue *= 2; } else { //求解過程當中,跳過了目標值,回到上一個值重新開始找 Console.WriteLine("跳過目標值,a=" + a); a = pre_a; addValue = 1; } }
求出來的結果是:a=90071992647409921code
實際上,根據double值的存儲結構應該是能夠從理論上推算出來這個值的。詳細的機制以及使用的注意事項參見MSDN(下方的連接)。這個具體的理論推算過程先留個坑在這裏吧,之後有時間了過來填。blog
參考:開發
http://technet.microsoft.com/zh-cn/library/system.doubleit