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