我遇到一个精度问题,在.NET中使用double我认为这只适用于浮点数,但现在我看到double是浮点数。
double test = 278.97 - 90.46;
Debug.WriteLine(test) //188.51000000000005
//correct answer is 188.51
处理此问题的正确方法是什么?回合?丢掉不需要的小数位?
答案 0 :(得分:10)
使用decimal数据类型。 “十进制值类型适用于需要大量有效积分和小数位且没有舍入误差的财务计算。”
答案 1 :(得分:5)
这种情况发生在许多语言中,并且源于我们通常无法在数字硬件中精确存储双精度或浮点数这一事实。有关如何经常存储双精度,浮点数和所有其他浮点值的详细说明,请查看维基百科上描述的各种IEEE规范。例如:http://en.wikipedia.org/wiki/Double_precision
当然还有其他格式,例如定点格式。但是这种不精确性在大多数语言中,以及为什么在条件句中使用双精度时经常需要使用epsilon测试而不是相等测试(即abs(x-y)<= 0.0001而不是x == y)。
如何处理这种不精确性取决于您,并取决于您的申请。