我有除法的结果:

4893.305785123966785163027491292661448576748


我想四舍五入到4893.30,但它总是返回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


该回合如何进行?我只考虑第二个小数的值。有任何想法吗?

最佳答案

“舍入是如何进行的?我只考虑小数点后两位的值。”


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

代替使用ROUND_HALF_DOWN


  向“最近的邻居”舍入的舍入模式...


...而是尝试使用ROUND_DOWN


  舍入模式向零舍入。切勿在舍弃小数前将数字递增(即截断)...


例如

    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

07-24 15:37