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


相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
JavaScript 前端开发
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
JS浮点数精度问题及高精度小数运算:BigNumber解决方案
1779 0
|
4月前
|
Web App开发 存储 数据处理
Chrome 下载大文件报错!用 Streamsaver.js 完美填坑
本文探讨了Chrome下载大文件报“网络错误”的原因及解决方案。由于Chrome对Blob数据有大小限制,导致大文件下载失败。通过将responseType改为ArrayBuffer可临时解决1-2G文件问题,但超3G仍会崩溃。最佳方案是使用Streamsaver.js实现流式下载,边接收边保存,避免内存溢出,完美支持超大文件下载。
2399 3
|
6月前
|
存储 SQL 分布式计算
大数据之路:阿里巴巴大数据实践——元数据与计算管理
本内容系统讲解了大数据体系中的元数据管理与计算优化。元数据部分涵盖技术、业务与管理元数据的分类及平台工具,并介绍血缘捕获、智能推荐与冷热分级等技术创新。元数据应用于数据标签、门户管理与建模分析。计算管理方面,深入探讨资源调度失衡、数据倾斜、小文件及长尾任务等问题,提出HBO与CBO优化策略及任务治理方案,全面提升资源利用率与任务执行效率。
|
5月前
|
JavaScript 前端开发
js小数运算出现的问题(精度丢失)及解决办法-亲测有效
JavaScript浮点数运算存在精度丢失问题,如0.1+0.2不等于0.3。原因是十进制小数转二进制时可能出现无限循环,导致舍入误差。本文提供一种精度处理方法,通过将小数转为整数运算后再还原,实现加减乘除的精确计算,解决常见浮点运算误差问题。
974 0
|
存储 负载均衡 算法
大数据散列分区计算哈希值
大数据散列分区计算哈希值
240 4
|
JavaScript 前端开发
|
11月前
|
缓存 JavaScript 前端开发
mapbox没有token/token失效,地图闪烁后变空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.
本博客介绍了mapbox如何去除token验证,暴力破解mapbox的token验证机制。一劳永逸解决mapbox地图闪现一下然后变成空白,报错Error: A valid Mapbox access token is required to use Mapbox GL JS.的方法,还介绍了类似问题的具体解决思路。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
SQL 分布式计算 DataWorks
MaxCompute MaxFrame评测 | 分布式Python计算服务MaxFrame(完整操作版)
在当今数字化迅猛发展的时代,数据信息的保存与分析对企业决策至关重要。MaxCompute MaxFrame是阿里云自研的分布式计算框架,支持Python编程接口、兼容Pandas接口并自动进行分布式计算。通过MaxCompute的海量计算资源,企业可以进行大规模数据处理、可视化数据分析及科学计算等任务。本文将详细介绍如何开通MaxCompute和DataWorks服务,并使用MaxFrame进行数据操作。包括创建项目、绑定数据源、编写PyODPS 3节点代码以及执行SQL查询等内容。最后,针对使用过程中遇到的问题提出反馈建议,帮助用户更好地理解和使用MaxFrame。
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
JavaScript 前端开发 开发工具
【Azure Developer】使用JavaScript通过SDK进行monitor-query的client认证报错问题
AADSTS90002: Tenant 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' not found. Check to make sure you have the correct tenant ID and are signing into the correct cloud. Check with your subscription administrator, this may happen if there are no active subscriptions for the tenant.
154 1