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

简介: 数字太大了,计算加法、减法会报错,结果不正确?怎么办?用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


相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
22天前
|
JavaScript 算法
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞检查,通过计算接触面积(重叠覆盖面积)大小来判断接触对象DOM
|
22天前
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
报错/ ./node_modules/axios/lib/platform/index.js Module parse failed: Unexpected token (5:2)怎么解决?
|
20小时前
|
前端开发 JavaScript 索引
【Web 前端】JS的几种具体异常类型(报错)
【4月更文挑战第22天】【Web 前端】JS的几种具体异常类型(报错)
|
1天前
|
Rust JavaScript 安全
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀
🚀JS使用Wasm为你的文件MD5计算装上火箭引擎🚀
|
5天前
|
存储 JavaScript
报错permission.js:41 [Vue warn]: Property “showClose“ must be accessed with “$data.showClose“ because
报错permission.js:41 [Vue warn]: Property “showClose“ must be accessed with “$data.showClose“ because
|
22天前
|
小程序 开发者
微信小程序“Error: xxx.js 已被代码依赖分析忽略,无法被其他模块引用”报错?
微信小程序“Error: xxx.js 已被代码依赖分析忽略,无法被其他模块引用”报错?
|
2月前
|
分布式计算 DataWorks IDE
MaxCompute数据问题之忽略脏数据如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
48 0
|
2月前
|
SQL 存储 分布式计算
MaxCompute问题之下载数据如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
40 0
|
2月前
|
分布式计算 关系型数据库 MySQL
MaxCompute问题之数据归属分区如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
38 0
|
2月前
|
分布式计算 DataWorks BI
MaxCompute数据问题之运行报错如何解决
MaxCompute数据包含存储在MaxCompute服务中的表、分区以及其他数据结构;本合集将提供MaxCompute数据的管理和优化指南,以及数据操作中的常见问题和解决策略。
41 1

热门文章

最新文章