C#中double值的精度問題

來源:互聯網
上載者:User

標籤: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值的精度問題

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.