C#中double值的精度問題

在開發的時候,遇到一個問題,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

相關文章
相關標籤/搜索