BigDecimal 不正确的舍入

BigDecimal Incorrect Round

我有这样的除法结果:

4893.305785123966785163027491292661448576748

我想四舍五入到 4893.30,但它总是 returns 4893.31。但是当小数点后第二位是 6 或更多时,我想四舍五入。

new BigDecimal("4893.305785123966785163027491292661448576748").setScale(2,BigDecimal.ROUND_HALF_DOWN)); to 4893.31 //BAD

new BigDecimal("4893.305").setScale(2,BigDecimal.ROUND_HALF_DOWN)); to 4893.30 //OK

new BigDecimal("4893.3055").setScale(2,BigDecimal.ROUND_HALF_DOWN)); to 4893.31 //BAD

轮次如何进行?我只想考虑小数点后第二位的值。有什么想法吗?

也许您正在寻找给定比例的截断函数?您显示的 BigDecimal 舍入完全按照设计工作。

"How does the round work? I want to take in consideration only the value of the second decimal."

听起来您想截断而不是舍入。

而不是使用ROUND_HALF_DOWN

Rounding mode to round towards "nearest neighbor"...

...改为尝试使用 ROUND_DOWN:

Rounding mode to round towards zero. Never increments the digit prior to a discarded fraction (i.e., truncates)...

例如

    BigDecimal bd = new BigDecimal("4893.305785123966785163027491292661448576748");
    bd = bd.setScale(2, BigDecimal.ROUND_DOWN);
    System.out.println(bd); // 4893.30

更新以回答问题编辑

如果您只想考虑某些小数位,那就是截断 ,然后是 四舍五入:

    BigDecimal bd = new BigDecimal("4893.305785123966785163027491292661448576748");
    bd = bd.setScale(3, BigDecimal.ROUND_DOWN);       // truncate to 4893.305
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_DOWN);  // round to 2 decimal places
    System.out.println(bd);                           // 4893.30

    bd = new BigDecimal("4893.306785123966785163027491292661448576748");
    bd = bd.setScale(3, BigDecimal.ROUND_DOWN);       // truncate to 4893.306
    bd = bd.setScale(2, BigDecimal.ROUND_HALF_DOWN);  // round to 2 decimal places
    System.out.println(bd);                           // 4893.31