C# Math.Round 错误?

Sco*_*ott 3 c# math

好的,我意识到现在是星期天的早,所以我希望我只是遗漏了一些明显的东西:

我有这个功能:

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

    decimal convertedAmount = amount / ratio;
    return Math.Round(convertedAmount, 2);
}
Run Code Online (Sandbox Code Playgroud)

当我这样称呼它时:

decimal tax = CashConversion(96.53, 15);
Run Code Online (Sandbox Code Playgroud)

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

Fal*_*nwe 5

检查Math.Round文档:由于 2 是偶数,并且第二个数字之后的下一个数字是 5,根据 IEEE 标准 754 第 4 节,该值被四舍五入。这称为银行家的舍入

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

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

Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)

  • @Falanwe 无需考虑事实,银行家四舍五入与从零四舍五入一样真实,可以说更多,因为它不太可能引入偏见 (2认同)