MidpointRounding.AwayFromZero

时间:2015-09-30 14:35:56

标签: c# .net

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

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

2 个答案:

答案 0 :(得分:1)

您正在四舍五入到小数位数,因此返回1299.49。

如果您希望它为1299.5,则舍入到小数点后1位。

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

关于AwayFromZero的文档:

  

当一个数字在另外两个数字之间时,它会向最接近零的数字四舍五入。

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

答案 1 :(得分:1)

您可能会对此过载如何工作感到困惑。根据{{​​3}}:

  

当一个数字在另外两个数字之间时,它会向最接近零的数字四舍五入。

在您的情况下,1299.492不在1229.49和1299.50之间,所以MidpointRounding.AwayFromZero甚至不适用。

看起来你实际上要做的是向上舍入到最接近的2位小数。在这种情况下,您需要类似MSDN on MidpointRounding的内容:

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