C#中double值的精度问题

  在开发的时候,遇到一个问题,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值