设置比例后舍入必要的异常,并为BigDecimal进行舍入

时间:2019-01-24 15:06:20

标签: java bigdecimal

我想总结一下来自数据库的净价和毛价。 这些数字在MySQL数据库中的存储方式如下:

decimal(38,3)

我已经阅读了有关Stackoverflow的相关问题,但仍然无法弄清楚为什么会出现此异常:

Caused by: java.lang.ArithmeticException: Rounding necessary
    at java.math.BigDecimal.commonNeedIncrement(BigDecimal.java:4148)
    at java.math.BigDecimal.needIncrement(BigDecimal.java:4204)
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:4112)
    at java.math.BigDecimal.setScale(BigDecimal.java:2452)
    at java.math.BigDecimal.longValueExact(BigDecimal.java:3090)
    at java.math.BigDecimal.intValueExact(BigDecimal.java:3147)

对于此代码:

setSumNetPrice(0);
setSumGrossPrice(0);

for(MyReport report : result){
    if(null != report.getNetPrice()){

        BigDecimal netPrice = report.getNetPrice().setScale(2, RoundingMode.HALF_UP);

        setSumNetPrice(getSumNetPrice() + netPrice.intValueExact());
    }

    if(null != report.getGrossMoney()){

        BigDecimal grossMoney = report.getGrossMoney().setScale(2, RoundingMode.HALF_UP);

        setSumGrossPrice(getSumGrossPrice() + report.getGrossMoney().intValueExact());
    }
}

我想念什么?谢谢!

编辑:

我编辑了代码,但仍然从“ grossMoney.intValueExact()”行中得到了相同的异常...

for(MyReport report : result){
    if(null != report.getNetPrice()){

        BigDecimal netPrice = report.getNetPrice().setScale(2, RoundingMode.HALF_UP);

        setSumNetPrice(getSumNetPrice() + netPrice.intValueExact());
    }

    if(null != report.getGrossMoney()){

        BigDecimal grossMoney = report.getGrossMoney().setScale(2, RoundingMode.HALF_UP);

        setSumGrossPrice(getSumGrossPrice() + grossMoney.intValueExact());
    }
}

0 个答案:

没有答案