代码之家  ›  专栏  ›  技术社区  ›  Alistair

双负双精度问题

  •  8
  • Alistair  · 技术社区  · 16 年前

    我在.NET中遇到了double的一个精确问题,我认为这只适用于float,但现在我看到double是一个float。

    double test = 278.97 - 90.46;
    Debug.WriteLine(test) //188.51000000000005
    
    //correct answer is 188.51
    

    正确的处理方法是什么?圆的?去掉不需要的小数点?

    2 回复  |  直到 8 年前
        1
  •  10
  •   Michael Petito    16 年前

    使用 decimal 数据类型。十进制值类型适用于需要大量有效整数和小数的财务计算,并且没有舍入错误。”

        2
  •  5
  •   foxwoods    16 年前

    这种情况发生在许多语言中,并源于这样一个事实,即我们通常不能在数字硬件中精确地存储双精度数或浮点数。有关如何存储双精度、浮点和所有其他浮点值的详细说明,请参阅维基百科上描述的各种IEEE规范。例如: http://en.wikipedia.org/wiki/Double_precision

    当然还有其他格式,比如定点格式。但这种不精确性在大多数语言中都存在,并且为什么在条件句中使用双精度(即abs(x-y)<=0.0001而不是x==y)时,经常需要使用epsilon测试而不是相等测试。

    如何处理这种不精确性取决于您自己,并且取决于您的应用程序。