js如何实现长整数相加
实现长整数相加的方法
在JavaScript中,处理超出Number.MAX_SAFE_INTEGER(即2^53 - 1)的长整数相加时,直接使用+运算符会导致精度丢失。以下是几种实现方法:
方法1:字符串模拟竖式加法
将长整数转换为字符串,按位相加并处理进位:
function addBigNumbers(a, b) {
let i = a.length - 1;
let j = b.length - 1;
let carry = 0;
let result = '';
while (i >= 0 || j >= 0 || carry > 0) {
const digitA = i >= 0 ? parseInt(a[i--]) : 0;
const digitB = j >= 0 ? parseInt(b[j--]) : 0;
const sum = digitA + digitB + carry;
result = (sum % 10) + result;
carry = Math.floor(sum / 10);
}
return result;
}
// 示例
console.log(addBigNumbers('12345678901234567890', '98765432109876543210')); // "111111111011111111100"
方法2:使用BigInt原生支持
ES2020引入的BigInt类型可直接处理大整数:
function addBigNumbers(a, b) {
return (BigInt(a) + BigInt(b)).toString();
}
// 示例
console.log(addBigNumbers('12345678901234567890', '98765432109876543210')); // "111111111011111111100"
方法3:处理数字和字符串混合输入
兼容数字和字符串输入,自动转换为字符串处理:
function addBigNumbers(a, b) {
a = a.toString();
b = b.toString();
let carry = 0;
let result = [];
const maxLength = Math.max(a.length, b.length);
for (let i = 0; i < maxLength; i++) {
const digitA = parseInt(a.charAt(a.length - 1 - i) || '0');
const digitB = parseInt(b.charAt(b.length - 1 - i) || '0');
const sum = digitA + digitB + carry;
result.unshift(sum % 10);
carry = Math.floor(sum / 10);
}
if (carry) result.unshift(carry);
return result.join('');
}
注意事项
- 输入验证:确保输入为有效数字字符串,避免非数字字符。
- 性能优化:对于超长数字,字符串方法的性能优于
BigInt。 - 负号处理:上述方法未处理负数,需额外判断符号位。
根据实际需求选择方法:现代环境优先使用BigInt,兼容性要求高时选择字符串模拟。







