Java特殊小数进位规则的列表求和逻辑实现技术咨询
Java特殊规则求和实现方案
核心逻辑设计
- 为避免浮点运算精度丢失,全程使用
BigDecimal做数值计算 - 初始化两个变量:
- 累计总和
total,初始值为0 - 上一轮传递的小数部分
lastDecimal,初始值为0
- 累计总和
- 按顺序遍历所有待求和数值:
- 将当前数值与
lastDecimal相加,得到临时计算值 - 拆分临时值的整数部分和小数部分
- 将整数部分累加至
total - 将拆分得到的小数部分赋值给
lastDecimal,进入下一轮计算
- 将当前数值与
- 遍历完成后,将
total按要求保留一位小数输出即可
完整代码实现
import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; public class SpecialSumCalculator { // 中间计算保留的小数位数,可根据业务精度需求调整 private static final int CALC_SCALE = 3; private static final RoundingMode ROUNDING_MODE = RoundingMode.HALF_UP; public static BigDecimal calculateSpecialSum(List<BigDecimal> numList) { BigDecimal total = BigDecimal.ZERO; BigDecimal lastDecimal = BigDecimal.ZERO; for (BigDecimal currentNum : numList) { // 当前值加上上一轮传递的小数部分 BigDecimal temp = currentNum.add(lastDecimal); // 拆分临时值的整数部分(向下取整) BigDecimal integerPart = temp.setScale(0, RoundingMode.DOWN); // 拆分临时值的小数部分 BigDecimal decimalPart = temp.subtract(integerPart).setScale(CALC_SCALE, ROUNDING_MODE); // 整数部分计入总和 total = total.add(integerPart); // 更新下一轮传递的小数部分 lastDecimal = decimalPart; } // 结果保留1位小数返回 return total.setScale(1, ROUNDING_MODE); } public static void main(String[] args) { // 测试用例:用户提供的示例数值 List<BigDecimal> testList = List.of( new BigDecimal("234.456"), new BigDecimal("345.456"), new BigDecimal("456.567"), new BigDecimal("567.678") ); BigDecimal result = calculateSpecialSum(testList); // 输出结果为1604.0,和示例预期一致 System.out.println(result); } }
逻辑验证
代入用户提供的示例数值执行代码,最终输出结果为1604.0,和手动计算的预期结果完全匹配。
内容的提问来源于stack exchange,提问作者SM_Park
相关产品推荐
相关产品推荐

