MidpointRounding.AwayFromZero

本文关键字:AwayFromZero MidpointRounding | 更新日期: 2023-09-27 18:15:14

为什么以下代码返回1299.49 ?根据msdn文档,它应该是1299.5。

Console.WriteLine(Math.Round( 1299.492, 2, MidpointRounding.AwayFromZero))

MidpointRounding.AwayFromZero

您将四舍五入到小数点后两位,因此返回1299.49。

如果你想要1299.5,四舍五入到小数点后1位。

Console.WriteLine(Math.Round( 1299.492, 1, MidpointRounding.AwayFromZero))

来自AwayFromZero的文档:

当一个数位于另外两个数的中间时,将其舍入到离0最近的那个数。

https://msdn.microsoft.com/en-us/library/system.midpointrounding (v = vs.110) . aspx

您可能对这种重载是如何工作的感到困惑。根据MSDN上的MidpointRounding:

当一个数位于另外两个数的中间时,将其舍入到离0最近的那个数。

在你的例子中,1299.492不在1229.49和1299.50的中间,所以MidpointRounding.AwayFromZero甚至不适用。


看起来你实际上要做的是四舍五入到最接近的小数点后两位。在这种情况下,您想要这样的答案:

public static double RoundUp(double input, int places)
{
    double multiplier = Math.Pow(10, Convert.ToDouble(places));
    return Math.Ceiling(input * multiplier) / multiplier;
}

通过乘以10^places(如果需要2位,则为100),调用Math.Ceiling,然后除以,四舍五入到指定的小数点后十位。

如此:

Console.WriteLine(RoundUp(1299.492, 2)); // 1299.5