Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET4中的Math.Round()行为_C#_Math_.net 4.0_Rounding - Fatal编程技术网

C# .NET4中的Math.Round()行为

C# .NET4中的Math.Round()行为,c#,math,.net-4.0,rounding,C#,Math,.net 4.0,Rounding,可能的重复项: 我有一个中间值(数字5),我需要指定如何取整(上限值或下限值) 我了解使用中点舍入参数进行Math.Round的行为,但这并不能解决我的问题: // 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))

可能的重复项:

我有一个中间值(数字5),我需要指定如何取整(上限值或下限值)

我了解使用
中点舍入
参数进行
Math.Round
的行为,但这并不能解决我的问题:

// 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

看一看接受参数的调用。使用它,您可以指定
ToEven
(向最近的偶数取整)或
AwayFromZero
(向远离零的方向取整到最近的数字)来更改舍入行为。

您可以使用
Math.Round()
Math.天花()
Math.Floor()
取决于您的需要。

看看,您可以使用Math.Round(十进制,中点舍入)进行此操作。

您有一个到
Math.Round
的重载,它从
中点舍入
获取枚举值

这有两种选择:

  • ToEven(默认值)也称为银行家舍入。我会找到最近的一对。所以2.5变成了2,而3.5变成了4
  • 远离零:始终将X.5四舍五入到X+1;例如,2.5变成了3

取整方法有两种不同的取整方式,您可以指定:

value = Math.Round(value, MidpointRounding.ToEven);
以及:

(如果未指定
中点舍入
值,则使用
ToEven
。)

如果您想进行汇总,可以使用
上限
方法:

value = Math.Ceiling(value);
如果要向下取整,请使用
Floor
方法:

value = Math.Floor(value);

看起来您想要的是TowardsZero或TowardsNegativeInfinity的非存在中点舍入值。唯一的选择是自己对舍入进行编码

可能是这样的:(未经测试,可能无法很好地处理inf/nan等)


这不是一个dup,他正在寻找一种方法,使中点朝着零或可能朝着-inf(不知道哪些原因所有的例子都是正数)旋转,如果我使用数学。旋转(3.5,middpointrounding.ToEven)将始终是4,但在某些情况下我需要它是3,在哪些情况下你需要它是3?如果你能提到这些案例,也许我可以为你找到一个解决方案:)可能会涉及其他人提到的Math.Floor()或Math.天花()。我想我需要手动检查我是否有一个中间值(x.5),并根据案例使用Floor或天花,比如
If(myValue%1==0.5)FloorCeil()。这里需要记住的一点是,如果您使用的是
double
类型,由于浮点精度的原因,0.5可能不完全是0.5,因此您应该使用另一种数据类型,如
decimal
,或者您需要在0.5上添加一个小的间隙,以便“足够接近”的值也算作0.5.eh。如果你不完全在,那么5可以用浮点表示。5你无论如何都不想做中点舍入注意这是比较浮点数是否相等的少数几种情况之一!
value = Math.Floor(value);
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);
}