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

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 数字太大了,计算加法、减法会报错,结果不正确?怎么办?用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


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
17天前
|
JavaScript
js计算时间差,包括计算,天,时,分,秒
js计算时间差,包括计算,天,时,分,秒
80 16
|
16天前
|
分布式计算 DataWorks 调度
oss数据同步maxcompute报错
在使用阿里云DataWorks同步OSS数据至MaxCompute时,遇到“Input is not in the .gz format”的报错。问题源于目标目录中存在一个空文件,导致同步时识别错误。
|
6天前
|
人工智能 分布式计算 大数据
超级计算与大数据:推动科学研究的发展
【9月更文挑战第30天】在信息时代,超级计算和大数据技术正成为推动科学研究的关键力量。超级计算凭借强大的计算能力,在尖端科研、国防军工等领域发挥重要作用;大数据技术则提供高效的数据处理工具,促进跨学科合作与创新。两者融合不仅提升了数据处理效率,还推动了人工智能、生物科学等领域的快速发展。未来,随着技术进步和跨学科合作的加深,超级计算与大数据将在科学研究中扮演更加重要的角色。
|
8天前
|
JavaScript 前端开发
今天被JavaScript的String型和数字型的+运算撞了一下腰。
今天被JavaScript的String型和数字型的+运算撞了一下腰。
|
2月前
|
JavaScript 前端开发 C++
【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
|
2月前
|
分布式计算 DataWorks 数据管理
DataWorks操作报错合集之写入ODPS目的表时遇到脏数据报错,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
分布式计算 DataWorks NoSQL
DataWorks操作报错合集之遇到报错:failed: ODPS-0130071:[1,36] Semantic analysis exception,该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之如何解决datax同步任务时报错ODPS-0410042:Invalid signature value
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
2月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之新建MAXComputer数据源时,如何解决报错ODPS-0420095: Access Denied
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
SQL 分布式计算 大数据
MaxCompute操作报错合集之 Spark Local模式启动报错,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。

热门文章

最新文章

下一篇
无影云桌面