好的,我意识到现在是星期天的早,所以我希望我只是遗漏了一些明显的东西:
我有这个功能:
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。我在这里错过了什么吗?
检查Math.Round的文档:由于 2 是偶数,并且第二个数字之后的下一个数字是 5,根据 IEEE 标准 754 第 4 节,该值被四舍五入。这称为银行家的舍入。
这不是错误,而是预期的行为。也许不是你所期待的。
如果你想要“数学上正确”的行为,你可以调用Decimal.Round(Decimal, Int32, MidpointRounding)重载,如下所示:
Math.Round(convertedAmount, 2, MidpointRounding.AwayFromZero);
Run Code Online (Sandbox Code Playgroud)