我有除法的结果:
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