js 大整数相减

244 阅读1分钟

ps:大整数相加通道:juejin.cn/post/695119…

$.extend({
  /**
   * 大整数相减
   * ## 确认数字大小: 判断两个数字转换后数组长度:长度一致需要进行判断处理 
   * ## 减法每次取出数组最后一个元素进行相减,考虑借位
   * @param bigNumberA  String 类型
   * @param bigNumberB String 类型
   */
  handlebigNumSub: function (bigNumberA, bigNumberB) {
    let numberArrA = bigNumberA.split('');
    let numberArrB = bigNumberB.split('');

    let isABigB = numberArrA.length > numberArrB.length;//根据数组长度比较数字大小
    let maxLength = numberArrA.length > numberArrB.length ? numberArrA.length : numberArrB.length;

    if (numberArrA.length == numberArrB.length) {//数组长度一致,根据顺位比较俩数字大小
      for (let i = 0; i < maxLength; i++) {
        if (numberArrA[i] > numberArrB[i]) {
          isABigB = true;
          break;//跳出循环
        };
      }
    }
    
    if (!isABigB) {//是否交换数组
      numberArrA = [numberArrB,numberArrB = numberArrA][0];
    };

    let subResult = '';
    while (maxLength) {
      let subItem = parseInt(numberArrA.pop()) - parseInt(numberArrB.pop() || 0);//各取最后一项进行计算
      if (subItem >= 0) {
        subResult = String(subItem) + subResult;
      } else {//负数向上借位(即加 10 处理)
        subResult = String(subItem + 10) + subResult;
        numberArrA[maxLength - 2]--;//向上借位(maxlength 与 numberArrA 长度一致,由于先进行 pop 操作,maxlength 未自减;所以此处需要 -2 获取 numberArrA 最后一项)
      }
      maxLength--;
    };
    return (isABigB ? '' : '-') + subResult;
  }
})