我有截断下面给出的double数据类型vaiable的小数位的函数
public double GetTruncate(double tobeTruncated, int divideFactor)
{
if (divideFactor == 0)
return Math.Truncate((double)tobeTruncated);
else
{
tobeTruncated = tobeTruncated * divideFactor;
tobeTruncated = Math.Truncate((double)tobeTruncated);
tobeTruncated = tobeTruncated / divideFactor;
}
return tobeTruncated;
}
示例:tobeTruncated = 35.66 dividefactor = 100
在执行上述行时,我将tobeTruncated的值设为 3565.9999999999995 ,而不是 3566 。我不知道原因。
当我将双变量更改为十进制时,我得到了正确答案。具有正确答案的修改函数如下:
public double GetTruncate(double tobeTruncated, int divideFactor)
{
decimal nTempData = (decimal)tobeTruncated;
if (divideFactor == 0)
return (double)Math.Truncate((decimal)nTempData);
else
{
nTempData = nTempData * divideFactor;
nTempData = Math.Truncate((decimal)nTempData);
nTempData = nTempData / (decimal)divideFactor;
}
return (double)nTempData;
}
有谁可以解释这背后的原因?
答案 0 :(得分:1)
在.NET中,decimal数据类型表示固定的精度数字。 double数据类型表示浮点数,它是近似值并且是hould not be used when absolute precision is required。
答案 1 :(得分:1)
浮点数只能用计算机用来存储它们的有限位数来近似。结果就是你所看到的。
阅读:Is double Multiplication Broken in .NET?