为什么以下代码返回1299.49?根据msdn文档,它应该给出1299.5。
Console.WriteLine(Math.Round( 1299.492, 2, MidpointRounding.AwayFromZero))
答案 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