美文网首页
JS超最大范围整数相加(包括负数)

JS超最大范围整数相加(包括负数)

作者: 季凌轩 | 来源:发表于2018-09-12 17:13 被阅读0次

    JS对于数字超过最大范围的数字会被立即转换为科学计数法显示,并且数字精度也有误差,所以要实现超出最大整数范围(包括负数)的加法,就需要自己实现一个方法:

    function sum(a, b) {
        var res = '', temp = 0, aSymbol = '', bSymbol = '', num1, num2, lastSymbol = '';
        if (a < 0) {
            aSymbol = '-';
            a = a.substring(1);
        }
    
        if (b < 0) {
            bSymbol = '-';
            b = b.substring(1);
        }
        aArr = a.split('');
        bArr = b.split('');
    
        while (aArr.length || bArr.length || temp) {
            if (aSymbol === bSymbol) {
                temp += ~~aArr.pop() + ~~bArr.pop();
                res = temp % 10 + res;
                temp = temp > 9 ? 1 : 0;
                lastSymbol = aSymbol;
            } else {
                num1 = ~~aArr.pop();
                num2 = ~~bArr.pop();
                if (parseInt(a, 10) < parseInt(b, 10)) {
                    temp += num2 - num1;
                    if (temp < 0) {
                        temp += 10;
                        res = temp % 10 + res;
                        temp = -1;
                    } else {
                        res = temp % 10 + res;
                        temp = 0;
                    }
                    lastSymbol = bSymbol;
               } else {
                    temp += num1 - num2;
                    if (temp < 0) {
                        temp += 10;
                        res = temp % 10 + res;
                        temp = -1;
                    } else {
                        res = temp % 10 + res;
                        temp = 0;
                    }
                    if (parseInt(a, 10) < parseInt(b, 10)) {
                        lastSymbol = aSymbol;
                    }
                }
            }
        }
        res = res.replace(/^0+/, '');
        if (!res) {
            res = '0';
        } else {
            res = lastSymbol + res;
        }
        return res
    }
    

    1、把每个数字字符串转换成数组。
    2、从数组最后开始循环相加:对于周符号的数字来说相对简单,只需要相加,然后取余,余数保留在结果中,大于9的向前进位。不同符号的,做减法,用大数字减小数。
    3、循环最后,如果temp不等于0,表示有向前进位,还要执行一次操作。
    4、最后,如果是负数结果,要加上符号。

    相关文章

      网友评论

          本文标题:JS超最大范围整数相加(包括负数)

          本文链接:https://www.haomeiwen.com/subject/cchbgftx.html