如何实现带千位分隔符的大数字字符串相加?
带千位分隔符的大数字字符串相加实现方案
问题描述
需要实现两个以字符串形式表示、带有千位分隔符(逗号)的大数字相加,示例:输入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
相关产品推荐
相关产品推荐

