在開發的時候,遇到一個問題,c#中定義一個double變量,當這個變量在很大的時候,讓這個變量加上或者減去一個較小的值不會改變其大小(這個其實與double變量的二進制存儲機制相關),就是說加上一個值之后的值.comPareTo(原來的值)返回0,就是說他們相等。
於是我想找到哪個具體的值是在加上或者減去1時,值的改變可以被檢測到的。於是有了以下代碼。
//因為相當大的范圍內都是可以檢測到大小改變的,所以不從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=90071992647409921
實際上,根據double值的存儲結構應該是可以從理論上推算出來這個值的。詳細的機制以及使用的注意事項參見MSDN(下方的鏈接)。這個具體的理論推算過程先留個坑在這里吧,以后有時間了過來填。
參考:
http://technet.microsoft.com/zh-cn/library/system.double