BigDecimal不正确的回合

时间:2015-01-16 21:12:53

标签: java bigdecimal

我有这种分裂的结果:

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

该轮如何运作?我只想考虑第二个小数的值。有什么想法吗?

2 个答案:

答案 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