Зарегистрировать проблему BigDecimal

Java

Когда сабж сегодня использовал 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() и посмотрел исходный код:

image.png

Проблема здесь в том, что возвращается новый объект 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());
    }
}

Результат, как и ожидалось