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

如何实现带千位分隔符的大数字字符串相加?

带千位分隔符的大数字字符串相加实现方案

问题描述

需要实现两个以字符串形式表示、带有千位分隔符(逗号)的大数字相加,示例:输入string1 = "25,000",string2 = "25,250",输出"50,250"。

已实现无分隔符的大数字字符串相加逻辑,但不清楚如何处理千位分隔符,同时想到一种先移除逗号再格式化结果的思路,希望得到可行的解决方案提示。

现有代码

无分隔符的大数字相加代码

class Solution {
    public String addStrings(String num1, String num2) 
    {
        StringBuilder sb = new StringBuilder();
        int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
        while (i >= 0 || j >= 0 || carry != 0) 
        {
            int sum = carry;
            if (i >= 0) 
            sum += num1.charAt(i--) - '0';
            
            if (j >= 0) 
            sum += num2.charAt(j--) - '0';
            
            sb.append(sum % 10);
            carry = sum / 10;
        }
        return sb.reverse().toString();
    }
}

先去逗号再格式化的思路代码

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");
System.out.println(formatter.format(amount));

可行解决方案提示

方案一:直接处理带分隔符的字符串,优化现有相加逻辑

不用提前移除逗号,在遍历字符串时跳过逗号即可,同时给最终结果添加千位分隔符:

class Solution {
    public String addCommaStrings(String num1, String num2) {
        StringBuilder sb = new StringBuilder();
        int i = num1.length() - 1, j = num2.length() - 1, carry = 0;
        
        while (i >= 0 || j >= 0 || carry != 0) {
            int sum = carry;
            // 跳过num1中的逗号
            if (i >= 0 && num1.charAt(i) != ',') {
                sum += num1.charAt(i) - '0';
                i--;
            } else if (i >= 0) {
                i--;
                continue;
            }
            // 跳过num2中的逗号
            if (j >= 0 && num2.charAt(j) != ',') {
                sum += num2.charAt(j) - '0';
                j--;
            } else if (j >= 0) {
                j--;
                continue;
            }
            
            sb.append(sum % 10);
            carry = sum / 10;
        }
        // 先反转得到无分隔符结果,再添加千位分隔符
        String rawResult = sb.reverse().toString();
        return addThousandSeparator(rawResult);
    }
    
    // 给无分隔符数字字符串添加千位分隔符
    private String addThousandSeparator(String num) {
        StringBuilder result = new StringBuilder();
        int count = 0;
        // 从右往左遍历添加分隔符
        for (int i = num.length() - 1; i >= 0; i--) {
            result.append(num.charAt(i));
            count++;
            if (count % 3 == 0 && i != 0) {
                result.append(',');
            }
        }
        return result.reverse().toString();
    }
}

此方案全程用字符串处理,避免了大数字转数值类型的精度丢失问题,适合处理任意长度的整数。

方案二:先移除逗号再相加,最后格式化结果(注意规避精度问题)

你想到的思路可以优化,不能用double存储大数字——double精度有限,超过2^53的整数会丢失精度,改用BigInteger处理:

import java.math.BigInteger;
import java.text.DecimalFormat;

public class Main {
    public static String addCommaNumbers(String num1, String num2) {
        // 移除字符串中的逗号
        String cleanNum1 = num1.replace(",", "");
        String cleanNum2 = num2.replace(",", "");
        // 用BigInteger执行高精度加法
        BigInteger sum = new BigInteger(cleanNum1).add(new BigInteger(cleanNum2));
        // 格式化结果添加千位分隔符
        DecimalFormat formatter = new DecimalFormat("#,###");
        return formatter.format(sum);
    }

    public static void main(String[] args) {
        System.out.println(addCommaNumbers("25,000", "25,250")); // 输出50,250
    }
}

如果需要处理带小数的带分隔符数字,替换BigInteger为BigDecimal即可,同样能保证精度。

总结

  • 纯整数场景下两种方案都可行:方案一更底层,不依赖额外类;方案二更简洁,适合快速开发。
  • 无论哪种方案,都要避免用double处理大数字,防止精度丢失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:33:35