【问题标题】:BigDecimal setScale using rounding mode half even not workingBigDecimal setScale 使用舍入模式一半甚至不起作用
【发布时间】:2018-07-30 22:30:07
【问题描述】:

请告诉我我犯的错误:

我有号码: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());
}

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

【问题讨论】:

    标签: java rounding currency bigdecimal


    【解决方案1】:

    仅当值在可能的舍入目标之间等距时,RoundingMode HALF_EVEN 才会向偶数邻居舍入。

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

    这意味着如果金额为 225.045(等距值),它将向下舍入。但由于您的 225.0453 的数量大于等距值,它仍会向上取整。

    【讨论】:

    • 谢谢。我不知道/意识到它需要考虑较少的有效小数位数。这仍然给我留下了一个问题,即我的该交易的帐户对帐单是 225.04,而我的(我想更精确的计算)返回 225.05。我想我需要在漂亮的打印之前弄平数字。还是非常感谢。正确答案
    • @Dennis 它考虑了数字的完整值。当 225.0453 更接近 225.05 时,为什么要四舍五入到 225.04?
    • 确实有道理。我想我的学校知识对我来说是最好的..我记得学过一些东西“如果你想四舍五入到 2 个小数,看看第三个,它是否低于 5 舍入是 5 或更多舍入”.. .当然,如果您查看更多的小数位数,这仍然成立……只有half_even roding模式我遇到了一个边缘情况,仅通过查看下一个数字就不能成立。感谢您指出这一点
    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多