javaScript两个大数相加

大数相加

原因:

在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')
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值