首页 > 解决方案 > 为 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());
    }
}

标签: javabigdecimal

解决方案


尝试将逗号向右移动。因此:

long value = new BigDecimal(4.13).movePointRight(2).longValueExact();

转换后的值为413


推荐阅读