数字太大了,计算加法、减法会报错,结果不正确?怎么办?用JavaScript实现大数据(超过20位的数字)相加减运算。

加法伺候 

//超过20位数值相加----------------------------------------
function bigNumAdd(a, b) {
    if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必须为字符串类型");
    if (a.includes("+") || a.includes("-") || b.includes("+") || b.includes("-")) return console.log("传参不要夹带正负符号+、-");

    var aArr = a.toString().split("");
    var bArr = b.toString().split("");
    var temporary = []; //临时值
    //比较大小长度,aArr的值要比bArr的值要大
    if (bArr.length > aArr.length) {
        //实现两值的调换
        temporary = aArr;
        aArr = bArr;
        bArr = temporary;
    } else if (bArr.length === aArr.length) {
        //比较数组里面的值
        var flag = true; //默认aArr比bArr的值大
        var length = bArr.length;
        for (var i = 0; i < length; i++) {
            var numObj = parseInt(aArr[i]);
            var addObj = parseInt(bArr[i]);
            if (numObj > addObj) {
                break;
            } else if (numObj < addObj) {
                flag = false;
                break;
            }
        }
        if (!flag) {
            //实现两值的调换
            temporary = aArr;
            aArr = bArr;
            bArr = temporary;
        }
    }

    for (var i = aArr.length - 1; i >= 0; i--) { //从后面算起
        var numObj = parseInt(aArr[i]);
        var addObj = parseInt(bArr[i - (aArr.length - bArr.length)]);

        if (!isNaN(addObj)) {
            if (numObj + addObj >= 10) {
                aArr[i] = numObj + addObj - 10;

                if (i - 1 < 0) {
                    //如果是90+10的话,超出了数组的范围
                    aArr.splice(0, 0, 1);
                } else {
                    for (var j = i - 1; j >= 0; j--) { //从后面算起
                        var obj = parseInt(aArr[j]);
                        if (obj + 1 === 10) {
                            aArr[j] = 0;
                            if (j === 0) {
                                //循环到最后一个,将aArr数组加上最前面1
                                // splice(position, aOfItemsToRemove, item)
                                // 拼接函数(索引位置, 要删除元素的数量, 元素)
                                aArr.splice(0, 0, 1);
                                i++; //数组的长度已经改变,将循环再次加多一次
                                break;
                            }
                        } else {
                            aArr[j] = obj + 1;
                            break;
                        }
                    }
                }
            } else {
                aArr[i] = numObj + addObj;
            }
        }
    }
    return aArr.join("");
}

console.log(bigNumAdd("999999999999999999999999", "999999999999999999999998"));//1999999999999999999999997
console.log(bigNumAdd("999999999999999999999999", "99999999999999999999998"));//1099999999999999999999997
console.log(bigNumAdd("1", "999999999999999999999999"));//1000000000000000000000000
console.log(bigNumAdd("1000000000000000000000000", "1"));//1000000000000000000000001

 

减法

//超过20位数值相减----------------------------------------
function bigNumSub(a, b) {
    if (a === b) return "0";
    if (!(typeof a === "string" && typeof b === "string")) return console.log("传入参数必须为字符串类型");
    if (a.includes("+") || a.includes("-") || b.includes("+") || b.includes("-")) return console.log("传参不要夹带正负符号+、-");

    function lt(a, b) {
        if (a.length < b.length) {
            return true;
        } else if (a.length === b.length) {
            return a < b;
        } else {
            return false;
        }
    }

    let isMinus = false;
    if (lt(a, b)) {
        [a, b] = [b, a];
        isMinus = true;
    }
    let len = Math.max(a.length, b.length);
    a = a.padStart(len, 0);
    b = b.padStart(len, 0);
    let flag = 0,
        result = "",
        temp;
    for (let i = len - 1; i >= 0; i--) {
        temp = parseInt(a[i]) - flag - parseInt(b[i]);
        if (temp < 0) {
            result = 10 + temp + result;
            flag = 1;
        } else {
            result = temp + result;
            flag = 0;
        }
    }
    result = (isMinus ? "-" : "") + result.replace(/^0+/, "");
    return result;
}

console.log(bigNumSub("999999999999999999999999", "999999999999999999999998"));//1
console.log(bigNumSub("999999999999999999999999", "99999999999999999999998"));//900000000000000000000001
console.log(bigNumSub("1", "999999999999999999999999"));//-999999999999999999999998
console.log(bigNumSub("1000000000000000000000001", "1000000000000000000000000"));//1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值