Когда сабж сегодня использовал BigDecimal для расчета, то столкнулся с проблемой, то есть как бы ни считал, конечное значение не изменилось.Тут сабж немного запутался, да еще и используется рекомендуемый API.Посмотрим сначала в коде:
BigDecimal totalPay = new BigDecimal("0");
BigDecimal totalIncomeOfMaster = new BigDecimal("0");
BigDecimal totalIncomeOfLB = new BigDecimal("0");
BigDecimal totalRebate = new BigDecimal("0");
if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {
for (RebateDetailVO rebateDetailVO : rebateDetailVOS.getList()) {
totalPay.add(rebateDetailVO.getFinalPayOfUser());
totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());
totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());
totalRebate.add(rebateDetailVO.getRebateAmt());
}
}
На первый взгляд с этим кодом проблем нет, но результаты после его запуска не оправдали ожиданий, поэтому испытуемый ввел метод add() и посмотрел исходный код:
Проблема здесь в том, что возвращается новый объект BigDecimal, поэтому суммированное значение не записывается.
Затем субъект изменит код:
BigDecimal totalPay = new BigDecimal("0");
BigDecimal totalIncomeOfMaster = new BigDecimal("0");
BigDecimal totalIncomeOfLB = new BigDecimal("0");
BigDecimal totalRebate = new BigDecimal("0");
if (CollectionUtils.isNotEmpty(rebateDetailVOS.getList())) {
for (RebateDetailVO rebateDetailVO : rebateDetailVOS.getList()) {
totalPay = totalPay.add(rebateDetailVO.getFinalPayOfUser());
totalIncomeOfMaster = totalIncomeOfMaster.add(rebateDetailVO.getFinalIncomeOfMaster());
totalIncomeOfLB = totalIncomeOfLB.add(rebateDetailVO.getFinalIncomeOfLB());
totalRebate = totalRebate.add(rebateDetailVO.getRebateAmt());
}
}
Результат, как и ожидалось