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

the*_*dev 1 c# math rounding .net-4.0

可能重复:
在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
Run Code Online (Sandbox Code Playgroud)

Øyv*_*hen 5

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

这有两个选择:

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


jk.*_*jk. 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);
}
Run Code Online (Sandbox Code Playgroud)