JavaScript中两个大数求和返回NaN问题求助
解决超大数值求和返回NaN的问题
问题根源
你的代码处理大数值返回NaN的核心原因是 JavaScript的Number类型精度限制:Number是双精度浮点数,最大安全整数为2^53 - 1(即9007199254740991),你定义的n1和n2远大于这个值,赋值时就已经丢失精度,调用toString()得到的不是原始数字的正确字符串,后续parseInt()处理自然会出现NaN。
修复后的代码
// 直接用字符串存储超大数值,避免Number精度丢失 let n1 = '1234567891234556555558'; let n2 = '1234567891234556555558'; // 处理逻辑 let a = n1; let b = n2; let carry = 0; // 进位 let result = ''; // 从末尾开始逐位相加 for (let i = 1; i <= a.length; i++) { const digitA = parseInt(a[a.length - i]); const digitB = parseInt(b[b.length - i]); const sum = digitA + digitB + carry; // 当前位结果 result = (sum % 10) + result; // 更新进位 carry = Math.floor(sum / 10); } // 处理最高位相加后的剩余进位 if (carry > 0) { result = carry + result; } // 输出结果 console.log(result); // 输出:2469135782469113111116
关键改动说明
- 用字符串直接存储超大数值,彻底避免Number类型的精度丢失问题;
- 简化求和逻辑:用取模
%10获取当前位结果,用Math.floor(sum/10)计算进位,比字符串截取处理更高效直观; - 补充了循环结束后进位的处理,避免最高位相加产生进位时遗漏。
内容的提问来源于stack exchange,提问作者Janmesh Nayak
相关产品推荐
相关产品推荐

