使用舍入模式的BigDecimal setScale一半甚至无法工作

时间:2018-07-30 22:30:08

标签: java rounding currency bigdecimal

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

我的电话号码是:225.0453,内部保存有4位数字。这是一个USD货币编号,我希望打印出来漂亮。我使用RoundingMode.HALF_EVEN

由于USD使用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());
}

此外,我也将为更好的解决方案而努力,因为这似乎不太正确。 (我尝试过nf.setRoundingMode,但这根本不起作用)

1 个答案:

答案 0 :(得分:3)

RoundingMode HALF_EVEN仅在可能的舍入目标之间的值相等时才向偶数舍入。

  

除非两个邻居都是等距的,否则舍入模式将舍入到“最近的邻居”。

这意味着如果金额为225.045,即等距值,它将四舍五入。但是因为您的225.0453金额大于等距值,所以仍会四舍五入。