.NET 4中的Math.Round()行为
可能重复:
在C#中:Math.Round(2.5)的结果是2(而不是3)! 你在跟我开玩笑吗?
.Net Round Bug
我有一个中间值(number.5),我需要指定如何舍入(上限值或下限值)。
我理解Math.Round
与MidPointRounding
参数的行为,但这并不能解决我的问题:
// 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
(在远离零的方向上舍入到最接近的数字)以更改舍入行为。