大数相加
原因:
在JavaScript中,两个大数不能直接相加的原因是因为JavaScript的Number类型遵循IEEE 754标准,它有一个最大安全整数的限制,即Number.MAX_SAFE_INTEGER,超过这个范围就会出现精度丢失
解决方法:
1.bigInt类型
如果你的环境支持ES2020(或更新版本),你可以使用BigInt来处理大数。BigInt可以表示任意大小的整数,并且不会丢失精度。
let num1 = BigInt("123456789012345678901234567890");
let num2 = BigInt("987654321098765432109876543210");
let sum = num1 + num2;
console.log(sum.toString()); // 转换回字符串以查看结果
2.字符串处理
function addStrings(num1, num2) {
let maxLength = Math.max(num1.length, num2.length);
let carry = 0;
let result = '';
while (maxLength > 0) {
let digit1 = parseInt(num1.charAt(--maxLength) || '0', 10);
let digit2 = parseInt(num2.charAt(--maxLength) || '0', 10);
let sum = digit1 + digit2 + carry;
result = (sum % 10) + result;
carry = Math.floor(sum / 10);
}
if (carry > 0) {
result = carry + result;
}
return result;
}
let num1 = "123456789012345678901234567890";
let num2 = "987654321098765432109876543210";
let sum = addStrings(num1, num2);
console.log(sum);
数组处理
思路:
整数==》字符串==》数组
str1=’12345678‘===>[‘8’,‘7’,‘6’,‘5’,‘4’,‘3’,‘2’,‘1’]
两数组对应的每一位元素进行相加,从个十百千万的顺序依次相加
若相加有进位(5+6=11),则标记一下,进位取1;并且本次计算累加值只取余数
数组1元素+数组2元素+进位>=10,取个位,进位=1
数组1元素+数组2元素+进位<10,取个位,进位=0
最后一位,仍有进位,进位直接push到数组中
function bigNumberSum(str1, str2) {
//字符串猜成数组并倒转
let arr1 = str1.split('').reverse()
let arr2 = str2.split('').reverse()
const length = Math.max(arr1.length, arr2.length)
const result = []
let flag = 0;
for (let i = 0; i < length; i++) {
//若arr1[i]为undefined,则Number(arr1[i])为NaN,为了保证取值,此时赋值为0
const numbers1 = Number(arr1[i]) || 0
const numbers2 = Number(arr2[i]) || 0
//依次相加+进位
let sum = numbers1 + numbers2 + flag
if (sum >= 10) {
//大于10取余数即个位数,标记进位
sum = sum % 10
flag = 1;
} else {
//小于10,进位置0
flag = 0
}
result.push(sum)
//最后一位若有进位,则直接push
if (i === length - 1 && flag) {
result.push(flag)
}
}
return result.reverse().join('')
}
bigNumberSum('999999999','1111111')