.NET 4中的Math.Round()行为

可能重复:
在C#中:Math.Round(2.5)的结果是2(而不是3)! 你在跟我开玩笑吗?
.Net Round Bug

我有一个中间值(number.5),我需要指定如何舍入(上限值或下限值)。

我理解Math.RoundMidPointRounding参数的行为,但这并不能解决我的问题:

 // To Even Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 4 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 6 // AwayFromZero Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 5 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 6 // in one case I need Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 4 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 5 // another case I need Console.WriteLine(Math.Round(4.4)); // 4 Console.WriteLine(Math.Round(4.5)); // 5 Console.WriteLine(Math.Round(4.6)); // 5 Console.WriteLine(Math.Round(5.5)); // 6 

Math.Round有一个重载,它从MidpointRounding获取一个枚举值。

这有两个选择:

  • ToEven(默认)也称为银行家四舍五入。 将绕到最近的一对。 因此2.5变为2,而3.5变为4。
  • AwayFromZero:始终将X.5舍入到X + 1; 因此2.5例如变为3。

看起来你想要的是TowardsZero或TowardsNegativeInfinity的不存在的MidpointRounding值。 唯一的选择是自己编写舍入代码。

也许这样的事情:(未经过测试,可能与inf / nan等处理不好)

 double RoundTowardNegInfinity(double val) { var frac = val - Math.Truncate(val); if (frac == 0.5 || frac == -0.5) { return Math.Floor(val); } return Math.Round(val); } double RoundTowardZero(double val) { var frac = val - Math.Truncate(val); if (frac == 0.5 || frac == -0.5) { return Math.Truncate(val); } return Math.Round(val); } 

Round方法有两种不同的舍入方式,您可以指定:

 value = Math.Round(value, MidpointRounding.ToEven); 

和:

 value = Math.Round(value, MidpointRounding.AwayFromZero); 

(如果未指定MidpointRounding值,则使用ToEven 。)

如果您想要向上舍入,则使用Ceiling方法:

 value = Math.Ceiling(value); 

如果要向下舍入,则使用Floor方法:

 value = Math.Floor(value); 

您可以根据需要使用Math.Round()Math.Ceiling()Math.Floor()

看看http://msdn.microsoft.com/en-us/library/ms131274.aspx ,您可以使用Math.Round(Decimal,MidpointRounding)。

看一下带有MidpointRounding参数的Math.Round()调用。 使用它,您可以指定ToEven (向最近的偶数舍入)或AwayFromZero (在远离零的方向上舍入到最接近的数字)以更改舍入行为。