码迷,mamicode.com
首页 > Windows程序 > 详细

C#中double值的精度问题

时间:2014-10-19 18:18:29      阅读:265      评论:0      收藏:0      [点我收藏+]

标签: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

bubuko.com,布布扣

实际上,根据double值的存储结构应该是可以从理论上推算出来这个值的。详细的机制以及使用的注意事项参见MSDN(下方的链接)。这个具体的理论推算过程先留个坑在这里吧,以后有时间了过来填。

参考:

http://technet.microsoft.com/zh-cn/library/system.double

C#中double值的精度问题

标签:style   blog   http   color   os   ar   使用   sp   div   

原文地址:http://www.cnblogs.com/zhang-ming/p/4035103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!