C#Math.Round错误?

时间:2011-07-31 14:43:41

标签: c# math

好的,我知道它是在星期天的早些时候所以我希望我只是遗漏了一些明显的东西:

我有这个功能:

private decimal CashConversion(decimal amount, decimal ratio)
{
    if (ratio == 1) return amount;

    decimal convertedAmount = amount / ratio;
    return Math.Round(convertedAmount, 2);
}

当我这样称呼时:

decimal tax = CashConversion(96.53, 15);

“tax”变量等于6.43。但是,96.53 / 15是6.435333333333333。将其舍入到2个位置应该返回6.44。我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:3)

检查documentation for Math.Round:由于2是偶数,而第二个之后的下一个数字是5,根据IEEE标准754第4节,该值向下舍入。它被称为银行家的舍入< / em>的

这不是错误,而是预期的行为。也许不是所期待的那个。

如果你想要“数学上正确”的行为,你可以调用Decimal.Round(Decimal, Int32, MidpointRounding)重载,如:

Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);

答案 1 :(得分:3)

确实是what is expected:6.435会转到6.44:

  

当d恰好位于两个舍入值之间时,结果是   在[(十进制+ 1)小数中具有偶数位的舍入值   位置]。例如,舍入到两位小数时,值为2.345   变为2.34,值2.355变为2.36 [,并且2.3653333变为   2.37。这个过程是已知的   向四舍五入,或四舍五入到最近。

答案 2 :(得分:2)

默认情况下,Math.Round使用银行家的四舍五入。您可能希望它使用中点舍入。要强制执行此操作,请尝试this

Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);