amenzai / myDiary

Record what you do every day
4 stars 0 forks source link

JS中两个大数求和 | 2018-04-027 #29

Closed amenzai closed 6 years ago

amenzai commented 6 years ago
/**
 * 计算两个大数的和
 * @param  {[Number]} a [数值A]
 * @param  {[Number]} b [数值B]
 * @return {String]}   [大数和]
 */
function sumBIgNum(a, b) {
  var l1 = 0,
    l2 = 0,
    lt, // 参数小数点位数
    result = '', // 保存最终结果字符串
    carry = 0, // 保存进位
    tmpArr = []; // 临时数组

  // 获取小数位数开始
  try {
    l1 = a.toString().split('.')[1].length
  }
  catch(e) {}
  try {
    l2 = b.toString().split('.')[1].length
  }
  catch(e) {}
  lt = Math.max(l1, l2);
  // 获取小数位数结束

  a = (a * Math.pow(10, lt)).toString().split('');
  b = (b * Math.pow(10, lt)).toString().split('');
  while (a.length || b.length || carry) {
    // 对每一项相加
    carry += ~~a.pop() + ~~b.pop(); // ~~'1'等 1  ~~undefined 等 0 ~~'2.33' 等 2
    result = carry % 10 + result; // 每一项相加后的个位
    carry = carry > 9 ? 1 : 0; // 每一项相加和大于10进1
  }
  result.replace(/^0+/, ''); // 去除最终结果前面的'0'
  tmpArr = result.split('');
  if (lt > 0) {
    tmpArr.splice(-lt, 0, '.');
    result = tmpArr.join('');
  }
  return result;
}