You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改Java代码实现所有BigDecimal金额按汇率除法处理

Java代码修改:统一处理所有行的金额汇率除法运算

问题背景

现有Java代码包含ReportRow类与Main类,功能是获取日期、BigDecimal类型金额及汇率数据,并填充日期间隙的缺失值。当前代码仅对填充的间隙行金额执行按汇率除法(采用RoundingMode.CEILING),但原始数据行的金额未做处理。需要修改代码,让所有行(原始行及填充行)的金额均按对应汇率完成除法运算。

解决方案

核心思路是将汇率计算逻辑抽离为独立方法,确保原始行和填充行在创建时都统一执行该计算,避免逻辑分散。

修改后的完整代码

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

class ReportRow {
    private LocalDate date;
    private BigDecimal amount;
    private BigDecimal exchangeRate;

    public ReportRow(LocalDate date, BigDecimal originalAmount, BigDecimal exchangeRate) {
        this.date = date;
        this.exchangeRate = exchangeRate;
        // 统一调用汇率计算方法处理金额
        this.amount = calculateConvertedAmount(originalAmount, exchangeRate);
    }

    // 封装统一的汇率计算逻辑
    private BigDecimal calculateConvertedAmount(BigDecimal originalAmount, BigDecimal exchangeRate) {
        if (originalAmount == null || exchangeRate == null || exchangeRate.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        // 按指定精度和舍入模式执行除法
        return originalAmount.divide(exchangeRate, 2, RoundingMode.CEILING);
    }

    // Getter方法
    public LocalDate getDate() {
        return date;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public BigDecimal getExchangeRate() {
        return exchangeRate;
    }

    @Override
    public String toString() {
        return "ReportRow{" +
                "date=" + date +
                ", amount=" + amount +
                ", exchangeRate=" + exchangeRate +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        // 模拟原始数据
        List<ReportRow> originalRows = new ArrayList<>();
        originalRows.add(new ReportRow(LocalDate.of(2024, 5, 1), new BigDecimal("1000"), new BigDecimal("7.2")));
        originalRows.add(new ReportRow(LocalDate.of(2024, 5, 4), new BigDecimal("1500"), new BigDecimal("7.15")));

        // 填充日期间隙并输出结果
        fillDateGaps(originalRows).forEach(System.out::println);
    }

    private static List<ReportRow> fillDateGaps(List<ReportRow> originalRows) {
        if (originalRows.isEmpty()) {
            return new ArrayList<>();
        }

        List<ReportRow> filledRows = new ArrayList<>();
        LocalDate startDate = originalRows.get(0).getDate();
        LocalDate endDate = originalRows.get(originalRows.size() - 1).getDate();
        int currentIndex = 0;
        ReportRow currentOriginalRow = originalRows.get(currentIndex);

        for (LocalDate date = startDate; !date.isAfter(endDate); date = date.plusDays(1)) {
            if (date.equals(currentOriginalRow.getDate())) {
                // 原始行直接加入(构造时已完成汇率转换)
                filledRows.add(currentOriginalRow);
                currentIndex++;
                if (currentIndex < originalRows.size()) {
                    currentOriginalRow = originalRows.get(currentIndex);
                }
            } else {
                // 填充间隙行:使用前一行的汇率和原始金额逻辑生成
                ReportRow previousRow = filledRows.get(filledRows.size() - 1);
                // 这里假设填充行的原始金额与前一行原始金额一致,可根据实际需求调整
                BigDecimal filledOriginalAmount = previousRow.getAmount().multiply(previousRow.getExchangeRate());
                filledRows.add(new ReportRow(date, filledOriginalAmount, previousRow.getExchangeRate()));
            }
        }

        return filledRows;
    }
}

修改要点

  • 统一计算逻辑:新增calculateConvertedAmount方法封装汇率除法运算,确保所有行的计算规则完全一致。
  • 构造时自动处理:修改ReportRow构造方法,在创建对象时直接调用计算方法处理金额,原始行和填充行无需分别编写逻辑。
  • 填充行兼容:填充间隙行时,依然通过ReportRow构造方法创建对象,自动触发汇率计算,无需额外修改填充逻辑。

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:01:32