8

如何将数字四舍五入到最接近的整数最接近的一半?

例如:

> 23.15 --> 23.5
> 23.56 --> 24.0

我知道的舍入函数是floorand ceil,但那些只舍入到最接近的整数。

4

4 回答 4

12

你想四舍五入到 0.5 的倍数?我理解正确吗?

double RoundUpToPointFive(double d)
{
    return Math.Ceiling(d * 2) / 2;
}
于 2012-10-13T04:25:55.083 回答
4

为什么不试试这个,在精度上有任何意义:

public double Ceiling(double value, double significance)
{
    if ((value % significance) != 0)
    {
        return ((int)(value / significance) * significance) + significance;
    }

    return Convert.ToDouble(value);
}

用法:

var d1 = Ceiling(23.15, 0.5); // 23.5
var d2 = Ceiling(23.56, 0.5); // 24.0

天花板的这个功能被 Microsoft Excel 使用,为了匹配这个计算,我设计了这个算法。

参考:天花板和地板功能,如 .NET 中的 Microsoft Excel

于 2012-10-13T04:39:42.043 回答
3

快速而肮脏的方式:

乘以 2,上限,然后除以 2。快速且易于理解,但由于数字溢出,这将在边缘情况下失败。

一种更稳健的方法是在使用上述方法评估轮次之前,将小数点前的所有内容剪掉,并将结果添加到您剪掉的整数上。

于 2012-10-13T04:26:39.850 回答
0

大卫的方法几乎可以密封它,但这是另一种更长的方法。

double dbNum = 3.44;
double dbNumModified = 3.44 + 0.5;
dbNumModified = Math.Floor(dbNum);
if(dbNumModified < dbNum)
{
   dbNumModified += 0.5;
}
return dbNumModified;
于 2012-10-13T04:37:18.187 回答