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());
}
}
解决方案
尝试将逗号向右移动。因此:
long value = new BigDecimal(4.13).movePointRight(2).longValueExact();
转换后的值为413
推荐阅读
- jenkins - 如何在从节点中执行写在Jenkins参数上的groovy脚本
- android - 从 Android Studio 生成 APK 时找不到符号
- javascript - OpenStreetMap 平铺不透明度
- formik - Formik Yup 验证字符串数组不起作用
- microsoft-dynamics - 在 AX 2012 R2 中的装运预订自动位置重新填充
- javascript - 元素的PHP动态id属性
- mongodb - Mongo DB 中的日期格式错误
- python - 数据框行之间的计算
- javascript - Javascript使用while循环查找和替换函数
- r - 在 RShiny 中,当 downloadHandler 中缺少预期文件时,使用 renderPrint/renderText 显示错误