可能重复:
In C#: Math.Round(2.5) result is 2 (instead of 3)! Are you kidding me?
.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
答案 0 :(得分:5)
Math.Round
的重载超过MidpointRounding
的枚举值。
这有两个选择:
答案 1 :(得分:5)
看起来你想要的是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);
}
答案 2 :(得分:2)
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);
答案 3 :(得分:1)
查看带有Math.Round()
参数的MidpointRounding
调用。有了它,您可以指定ToEven
(向最近的偶数舍入)或AwayFromZero
(在远离零的方向上四舍五入到最接近的数字)以改变舍入行为。
答案 4 :(得分:1)
您可以根据需要使用Math.Round()
,Math.Ceiling()
或Math.Floor()
。
答案 5 :(得分:1)
看一下http://msdn.microsoft.com/en-us/library/ms131274.aspx,你可以使用Math.Round(Decimal,MidpointRounding)。