js大数相加解决方法

1,658 阅读1分钟

1. 为什么要解决大数相加问题

JS 在存放整数的时候是有一个安全范围的,一旦数字超过这个范围便会损失精度。
我们不能拿精度损失的数字进行运行,因为运算结果一样是会损失精度的。
所以,我们要用解决精度丢失问题。
JS 中整数的最大安全范围可以查到是:9007199254740991

2.利用补齐法来解决js超大数字之间相加的问题

            let a = '1234567891011'
            let b = '123456789'
            //1.比较两个数长度  然后短的一方前面补0
            if(a.length>b.length){
                let arr = Array(a.length-b.length).fill(0);
            // join() 方法用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的。
                b = arr.join('')+b
            }else if(a.length<b.length){
                let arr = Array(b.length-a.length).fill(0);
                a = arr.join('')+a 
            }
            let c = Number(a)+parseInt(b);
            console.log(c);

3.反转两个数 (这里是因为人习惯从左往右加 而数字相加是从右到左 因此反转一下比较好理解)

            //reverse() 方法用于颠倒数组中元素的顺序。
            a = a.split('').reverse();
            b = b.split('').reverse();

4.循环两个数组 并进行相加 如果和大于10 则 sign = 1,当前位置的值为(和%10)

             let sign = 0;//标记 是否进位
            let newVal = [];//用于存储最后的结果
            for(let j = 0;j<a.length;j++){
            let val = a[j]/1+b[j]/1+sign;//除1是保证都为数字 这里也可以用Number()
                if(val>=10){
                    sign = 1;
                    newVal.unshift(val%10)//这里用unshift而不是push是因为可以省了使用reverse
                }else{
                    sign = 0;
                    newVal.unshift(val)
                }
            }
            
            let result = newVal.join('');
            console.log(result)

5. 大神的精简版

        function addBig(a, b) {
            let temp = 0,
                res
            a = a.split('');
            b = b.split('');
            while (a.lenght || b.length || temp) {
                temp += wwa.pop() + nurb.pop();
                res
                    (temp % 10) + res;
                temp = temp > 9;
            }
            return res.replace(/^0+/g, ' ');
        }