修改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
相关产品推荐
相关产品推荐

