Math.Round数字,带小数点后3位

时间:2013-11-01 17:25:29

标签: c# rounding

有人可以向我解释为什么Math.Round(1.565,2) = 1.56而不是1.57

4 个答案:

答案 0 :(得分:2)

Math.Round()使用了Banker的舍入算法。基本上它将以5结尾的任何数字朝向偶数。因此1.565向下(向6)向下但向上向1.575向(向8向上)。如果添加许多舍入数字,这可以避免累积误差累积。

答案 1 :(得分:1)

1.565的double表示并不准确,并且略低于该数量 - 1.564999999999999946709294817992486059665679931640625左右。因此,当四舍五入到小数点后两位时,它会向下舍入。

即使你使用decimal(它精确地表示小数分数)并尝试Math.round(1.565M,2),这也会向下舍入,因为Math.round(number, decimalPlaces)将值放在一个值和接下来是最后一位数是偶数的那个 - 有时称为banker's rounding。例如,Math.round(1.575M,2)会向上舍入。

答案 2 :(得分:1)

请参阅:Math.Round Method (Double, Int32)

  

由于代表可能导致精度损失   十进制值作为浮点数或执行算术   对浮点值的操作,在某些情况下为Round(Double,   Int32)方法可能看起来不是将中点值舍入到最近的值   偶数值小数位数。这在图中说明   下面的示例,其中2.135舍入到2.13而不是2.14。   发生这种情况是因为内部方法将值乘以   10个数字,这种情况下的乘法运算受到a   失去精确度。

示例是:

   public static void Main()
   {
      double[] values = { 2.125, 2.135, 2.145, 3.125, 3.135, 3.145 };
      foreach (double value in values)
         Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2));

   }

答案 3 :(得分:0)

这是因为内部方法将值乘以10digits,并且在这种情况下的乘法运算会受到精度损失的影响。 http://msdn.microsoft.com/en-us/library/system.math.round.aspx#Round5_Examplehttp://msdn.microsoft.com/en-us/library/75ks3aby.aspx