美文网首页
js大整数运算

js大整数运算

作者: 躺在家里干活 | 来源:发表于2019-08-29 09:37 被阅读0次

    对于大整数,是指超过规定类型的整数,它一般的存储类型为字符串类型char。在JS中,需要将字符串中的每一位字符利用parseInt()转成整数,再做加减,否则最后的结果是字符串的连接

    举个栗子?

    9999999999999999 == 10000000000000000; // true

    当 x 大于 2^53 且二进制有效位数大于 53 位时,就会存在精度丢失。这和小数的精度丢失本质上是一样的。小数和大整数的精度丢失,并不仅仅在 JavaScript 中存在。严格来说,使用了IEEE 754 浮点数格式来存储浮点类型的任何编程语言(C/C++/C#/Java 等等)都存在精度丢失问题。在 C#、Java 中,提供了 Decimal、BigDecimal 封装类来进行相应的处理,才避开了精度丢失。

    大整数相加

      function add(a, b) {
            const lena = a.split('').length;
            const lenb = b.split('').length;
            let maxLen;
            let minLen;
            let result;
            let total = [];
            let addFlag = 0;
    
            if (lena > lenb) {
                maxLen = lena;
                minLen = lenb;
            } else {
                maxLen = lenb;
                minLen = lena;
            }
    
            for (let i = maxLen - 1, j = minLen - 1; i >= 0; i--, j--) {
                if (j >= 0) {
                    result = parseInt(a[i]) + parseInt(b[j]) + addFlag;
                } else {
                    result = parseInt(a[i]) + addFlag;
                }
                if (result > 9) {
                    result = result - 10;
                    if (i == (maxLen.length - 1)) result[maxLen.length] = 1;
                    addFlag = 1;
                    total.unshift(result);
                } else {
                    total.unshift(result);
                    addFlag = 0;
                }
            }
            const final = total.join('');
            return final;
        }
        console.log(add('1112343', '12348')); // 1124691
    

    大整数相乘

      function multi(a, b) {
            var str1, str2, len1, len2, maxlen, result = [];
            str1 = a.split("").reverse();
            str2 = b.split("").reverse();
            len1 = str1.length;
            len2 = str2.length;
            //因为要在下一步做累加,如果不初始化为0,result[]中的值会变为NaN
            //因为未初始化的数组中的值为undefined
            for (var i = 0; i < len1; i++)
                for (var j = 0; j < len2; j++)
                    result[i + j] = 0;
            for (var i = 0; i < len1; i++)
                for (var j = 0; j < len2; j++)
                    //根据乘法的手动计算方式,在上下相同位上会有相加
                    result[i + j] += parseInt(str1[i]) * parseInt(str2[j]);
            var n = result.length;
            for (var k = 0; k < n; k++) {
                var temp = result[k];
                if (temp >= 10) {
                    result[k] = temp % 10;
                    //JS中的"/"不是除法取整,会取得小数,所以要用Math.floor()
                    result[k + 1] += Math.floor(temp / 10);
                }
            }
            return result.reverse().join("");
        }
        var d = multi("99999999999999999", "1");
        console.log(d);
    

    大整数相减

      function jian(a, b) {
            var zong = [String(a), String(b)];
            var fen = [];
            zong = getMax(zong[0], zong[1]);
            if (zong.length == 3) {
                //alert("不足");
                return false;
            }
            zong[0] = zong[0].split('');
            zong[1] = zong[1].split('');
            var jialing;
            if (!(zong[0].length == zong[1].length)) {
                jialing = new Array(zong[0].length - zong[1].length + 1).join('0');
                zong[1] = jialing.split('').concat(zong[1]);
            }
            var next = 0;
            for (var i = (zong[0].length - 1); i >= 0; i--) {
                var cha = Number(zong[0][i]) - Number(zong[1][i]) - next;
                next = 0;
                if (cha < 0) {
                    cha = cha + 10;
                    next = 1;
                }
                fen.unshift(cha % 10);
            }
            var result = fen.join('');
            if (result[0] == 0) {
                result = shanchuling(result);
            }
            return result;
        }
    

    我的个人博客,有空来坐坐

    相关文章

      网友评论

          本文标题:js大整数运算

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