C# 双精度问题

C# 双精度问题,c#,double,precision,C#,Double,Precision,我在.NET中遇到了一个double的精度问题,我以为这只适用于浮点,但现在我看到double是一个浮点 double test = 278.97 - 90.46; Debug.WriteLine(test) //188.51000000000005 //correct answer is 188.51 正确的处理方法是什么?圆形的删除不需要的小数点?使用数据类型。“十进制值类型适用于需要大量有效整数和小数位数且无舍入错误的金融计算。”这种情况在许多语言中都会发生,其原因是我们通常无法在数字

我在.NET中遇到了一个double的精度问题,我以为这只适用于浮点,但现在我看到double是一个浮点

double test = 278.97 - 90.46;
Debug.WriteLine(test) //188.51000000000005

//correct answer is 188.51

正确的处理方法是什么?圆形的删除不需要的小数点?

使用数据类型。“十进制值类型适用于需要大量有效整数和小数位数且无舍入错误的金融计算。”

这种情况在许多语言中都会发生,其原因是我们通常无法在数字硬件中精确存储双精度或浮点数。有关双精度、浮点和所有其他浮点值通常如何存储的详细说明,请参阅维基百科上描述的各种IEEE规范。例如:


当然还有其他格式,例如定点格式。但是这种不精确性在大多数语言中都存在,这就是为什么在条件句中使用double(即abs(x-y))时,经常需要使用epsilon测试而不是相等测试的原因你用这些双精度码做什么?例如,如果你要用其他类型的货币值。那么听Michael说。双精度码会咬你。不,实际上
Debug.WriteLine(test)
会写188.51。要重现你的输出,用
Debug.WriteLine(“{0:R}”,test)
。默认情况下,只显示15位有效数字,以避免出现类似问题。+1如果你在做金融工作,你真的需要使用
十进制
。十进制是金融计算中应该使用的正确数据类型。它不需要舍入,但可以最大限度地减少舍入带来的错误。