標籤:style blog http color os ar 使用 sp div
在開發的時候,遇到一個問題,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
C#中double值的精度問題