大数据相加

153 阅读1分钟

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(',', '');
  },
})

第一种方法与第三种方法大同小异;第三种更加符合常规加法运算规则