我有这种分裂的结果:
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
该轮如何运作?我只想考虑第二个小数的值。有什么想法吗?
答案 0 :(得分:1)
也许您正在寻找给定比例的截断函数?你展示的BigDecimal四舍五入完全按照设计工作。
答案 1 :(得分:1)
“轮次是如何工作的?我只想考虑第二个小数的值。”
听起来你想要截断而不是圆形。
而不是使用ROUND_HALF_DOWN
:
舍入模式向“最近邻居”舍去......
...相反,请尝试使用ROUND_DOWN
:
舍入模式向零舍入。永远不要在丢弃的分数之前递增数字(即截断)......
e.g。
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