【大整数相加】含小数的数字字符串相加函数

930 阅读1分钟

场景要求:给定两个大整数,用字符串表示,例如"485469847.1545","944561612.17",输出"1430031459.3245",写一个函数输出他们的和,不通过其他高精度加法函数

实现思路:首先判断边界问题,之后截取两个字符串小数部分的长度,以最长的长度为准,短的后边补0(此处为小数部分),再通过对比两个字符串的长度,以最长的长度为准,短的前边补0(此处为整数部分),然候通过模拟整数加法算出结果,最后将小数点插入小数部分最长的位置。

代码实现:

const add = (a, b) => {
  // 判断边界
  if(a.length && !b.lengthreturn a
  if(!a.length && b.lengthreturn b
  if(a === '0' && b === '0'return '0'
  let aArr = a.split('.')
  let bArr = b.split('.')
  // 求出小数部分的长度
  let alen = a.split('.').length === 2? a.split('.')[1].length: 0
  let blen = b.split('.').length === 2? b.split('.')[1].length: 0
  // 取小数部分最长的长度
  let len  = alen > blen ? alen : blen
  // 将分割后的字符串拼接
  a = aArr[0] + ( aArr[1]? aArr[1] : '' )
  b = bArr[0] + ( bArr[1]? bArr[1] : '' )
  // 小数位数补0
  for (let i = 0; i < len - alen; i++) {
    a += '0' 
  }
  for (let j = 0; j < len - blen; j++) {
    b += '0' 
  }
  // 整数位数补0
  let maxLength = Math.max(a.length, b.length)
  a = a.padStart(maxLength, 0)
  b = b.padStart(maxLength, 0)
  // 模拟整数加法
  let t = 0, f = 0, sum = ''
  for (let i = maxLength - 1; i >= 0; i--) {
    t = parseInt(a[i]) + parseInt(b[i]) + f
    f = Math.floor(t / 10)
    sum = t % 10 + sum
  }
  // 处理首位加法 超过10进1
  if (f == 1) sum = '1' + sum
  // 拼接字符串返回结果
  return sum = sum.substring(0, sum.length - len) + '.' + sum.substring(sum.length - len, sum.length)
}

补充说明: 这里的小数位数补0,是为了两个小数部分位数对齐,方便加法运算,整数部分同理。