asp.net-mvc 3 c#Math.round没有舍入像0.010000001或0.2399999999997的浮点数

时间:2012-05-18 13:33:09

标签: c# asp.net-mvc asp.net-mvc-3 rounding

我的控制器中有以下代码:

    private void setProgress(float value)
    {
        progress = (float)Math.Round(value,4);
    }

但是当值类似于标题中的数字(非常接近int的数字)时,它不起作用,进度只会获得原始值。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

因为1和24可能无法使用二进制浮点数精确表示,具体取决于这些数字的计算方式。如果你需要一个真正的整数,将它舍入然后将其转换为int:

private void setProgress(float value)
{
    progress = Convert.ToInt32((float)Math.Round(value,0));
}

如果你需要比较一个浮点数到一个int(即使是一个常数,然后将差值与一些非常小的数字进行比较:

private bool AreCloseEnoughToEqual(double d1, double d2)
{
    const double _EPSILON = 0.00000001;
    return Math.Abs(d1-d2) < _EPSILON;
}

如果您需要显示,就好像它是一个整数,请将其显示为0位小数:

 Console.WriteLine("{0:N0}",d1);