js 能处理数字允许范围内的加法运算,但是对于超大数字的加法运算无法正常执行;通过数字分割成为数组进行计算再组合得到结果
1、通过倒叙数组进行操作
$.extend({
/**
* 大整数相加
* ## 加法倒序数组相加
* @param numberA String 类型
* @param numberB String 类型
*/
handleBigNumSum: function (numberA, numberB) {
const maxLength = numberA.length > numberB.length ? numberA.length : numberB.length //获取较长数组长度(即位数较大数字)
const numArrA = numberA.split('').reverse();
const numArrB = numberB.split('').reverse();
let resultArr = new Array(maxLength).fill(0);//创建结果数组,长度为 maxLength 元素置 0
for (let i = 0; i < resultArr.length; i++) {
let itemSum = resultArr[i];
itemSum += (Number(numArrA[i]) ? Number(numArrA[i]) : 0);
itemSum += (Number(numArrB[i]) ? Number(numArrB[i]) : 0);
if (itemSum >= 10) {
itemSum = itemSum - 10;
resultArr[i + 1] = 1;
};
resultArr[i] = itemSum;
}
if (resultArr[maxLength] == 0) {//去除结果数组最后一位 0 (即结果和 无进一位)
resultArr.splice(maxLength, 1)
}
return resultArr.reverse().toString().replaceAll(',', '');
})
2、利用 es6 新特性 reduce 方法计算
$.extend({
/**
* 大整数相加
* ## es 6 reduce 方法 进位return prev: val>10?1:0
* ## 第二个数字比第一个数字长度长,交换数字
* @param bigNumberA String 类型
* @param bigNumberB String 类型
*/
handleBigNumSumByReduce: function (bigNumberA, bigNumberB) {
const isABigB = bigNumberA.length > bigNumberB.length
let numArrA = bigNumberA.split('');
let numArrB = bigNumberB.split('');
let sumResult = [];
if (!isABigB) {//数字 B 比数字 A 长度较长或者一致则交换数组;方便后续进行对 数组 B 进行取值计算
numArrA = [numArrB, numArrB = numArrA][0];
};
numArrA.reverse().reduce((prev, curr) => {
const currSum = prev + parseInt(curr) + (parseInt(numArrB.pop()) || 0);
const currPushVal = currSum > 10 ? currSum - 10 : currSum;
sumResult.unshift(currPushVal);
return currSum > 10 ? 1 : 0;//自定义返回 prev 值;
}, 0);
return sumResult.toString().replace(/\,/g, '');
},
})
3、正序数组
$.extend({
/**
* 大整数相加
* ## 正序相加 各取数组最后一位进行计算 >= 10 进一位 ;计算结果替换结果数组最后一位
* @param numberA String 类型
* @param numberB String 类型
*/
handleBigNumSum: function (numberA, numberB) {
let maxLength = numberA.length > numberB.length ? numberA.length : numberB.length
let numArrA = numberA.split('');
let numArrB = numberB.split('');
let resultArr = [];
let enterVal = 0;//是否进一
while (maxLength+1) {
let itemSum = enterVal;
itemSum += parseInt(numArrA.pop()) || 0;
itemSum += parseInt(numArrB.pop()) || 0;
if (itemSum >= 10) {
itemSum = itemSum - 10;
enterVal = 1;
}else{
enterVal = 0;
};
resultArr.unshift(itemSum);
maxLength--;
}
return resultArr.toString().replaceAll(',', '');
},
})
第一种方法与第三种方法大同小异;第三种更加符合常规加法运算规则