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

SaaS 模式云数据仓库必修课

|
9天前
|

DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时，出现找不到文件资源的情况，是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台，支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中，可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
30 0
|
7天前
|

Vue.js计算属性：实现数据驱动的利器
Vue.js计算属性：实现数据驱动的利器
10 0
|
3天前
|

8 0
|
4天前
|
SQL 分布式计算 数据挖掘

717 9
|
7天前
|
JavaScript 前端开发 流计算

14 0
|
7天前
|
JavaScript 前端开发 数据处理

12 0
|
9天前
|

9 0
|
9天前
|

nbcio-vue下载安装后运行报错，diagram-js没有安装
nbcio-vue下载安装后运行报错，diagram-js没有安装
14 0
|
9天前
|

js的变量以及运算
js的变量以及运算
14 1
|
9天前
|

DataWorks操作报错合集之DataWorks ODPS数据同步后，timesramp遇到时区问题，解决方法是什么
DataWorks是阿里云提供的一站式大数据开发与治理平台，支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中，可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
31 0