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

时间:2011-03-02 08:58:44

标签: c# math .net-4.0 rounding

  

可能重复:
  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

6 个答案:

答案 0 :(得分:5)

Math.Round的重载超过MidpointRounding的枚举值。

这有两个选择:

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

答案 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)。