BigDecimal setScale 使用舍入模式一半甚至不起作用

Den*_* H. 1 java currency rounding bigdecimal

有人请告诉我我做的错误:

我有号码:225.0453,内部保存有 4 位数字。这是一个美元货币数字,我想要漂亮的打印显示。我用RoundingMode.HALF_EVEN

由于美元使用 2 个小数位数,因此半偶数四舍五入的数字应为 225.04 美元。但我得到 225.05 美元。

这是我的代码(我将其更改为创建 MWE):

@Override
public String toString() {
    Currency cur = Currency.getInstance("USD");
    BigDecimal result = new BigDecimal("225.0453");
    result = result.setScale(cur.getDefaultFractionDigits(),RoundingMode.HALF_EVEN);
    NumberFormat nf = NumberFormat.getCurrencyInstance();
    nf.setCurrency(cur);
    nf.setMaximumFractionDigits(cur.getDefaultFractionDigits());
    return nf.format(result.doubleValue());
}
Run Code Online (Sandbox Code Playgroud)

此外,我也很乐意提供更好的解决方案,因为这似乎不太正确。(我试过了,nf.setRoundingMode但根本没有用)

rge*_*man 5

RoundingMode HALF_EVEN轮仅向当值可能四舍五入目标之间等距相邻的偶数。

舍入模式向“最近邻居”舍入,除非两个邻居等距,在这种情况下,向偶数邻居舍入。

这意味着如果数量为 225.045(等距值),它会向下取整。但是因为您的 225.0453 的数量大于等距值,它仍然会向上取整。