以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
126. BigDecimal 加法

可以通过将两个浮点数转化为整数再进行加法运算,最后再将结果转化为浮点数格式。

具体步骤如下:

  1. 对于传入的两个浮点数,需要将小数点后的位数相等,可以通过在末尾加0来实现,比如将 1.23 转化为 12300,将 4.567 转化为 456700。需要保留各个数值的正负号信息。
  2. 对于上一步得到的整数,直接进行加法运算。
  3. 将运算结果转换为浮点数格式,具体做法是在小数点前插入正负号,然后在小数点前的位数超过1时,在第一个字符后插入小数点。

可以使用数组来存储结果,从低位往高位依次计算,注意要先用较短的数值补齐较长的数值。最终得到的数组需要反转并转换成字符串。

以下是完整代码:

function add(a, b) {
  const MAX_LEN = 100
  const aParts = a.split('.')
  const bParts = b.split('.')
  const aInt = aParts[0]
  const bInt = bParts[0]
  const aDecimal = aParts[1] || ''
  const bDecimal = bParts[1] || ''
  const signA = aInt[0] === '-' ? -1 : 1
  const signB = bInt[0] === '-' ? -1 : 1
  
  // 补齐小数点后位数
  while (aDecimal.length < bDecimal.length) {
    aDecimal += '0'
  }
  while (bDecimal.length < aDecimal.length) {
    bDecimal += '0'
  }
  
  const aIntAbs = aInt.replace('-', '')
  const bIntAbs = bInt.replace('-', '')
  const aDecimalAbs = aDecimal.replace('-', '')
  const bDecimalAbs = bDecimal.replace('-', '')
  const result = []
  let carry = 0
  
  for (let i = 0; i < MAX_LEN || carry !== 0; i++) {
    const digitA = parseInt(aIntAbs[aIntAbs.length - 1 - i] || 0) * signA
    const digitB = parseInt(bIntAbs[bIntAbs.length - 1 - i] || 0) * signB
    const sum = digitA + digitB + carry
    const digit = sum % 10
    carry = Math.floor(sum / 10)
    result.push(digit)
  }
  
  // 去除末尾的0
  while (result.length > 1 && result[result.length - 1] === 0) {
    result.pop()
  }
  
  if (aDecimalAbs.length > 0 || bDecimalAbs.length > 0) {
    result.push('.')
    for (let i = 0; i < MAX_LEN; i++) {
      const digitA = parseInt(aDecimalAbs[i] || 0) * signA
      const digitB = parseInt(bDecimalAbs[i] || 0) * signB
      const sum = digitA + digitB + carry
      const digit = sum % 10
      carry = Math.floor(sum / 10)
      result.push(digit)
    }
  }
  
  // 去除末尾的0
  while (result.length > 1 && result[result.length - 1] === 0) {
    result.pop()
  }
  
  // 添加正负号
  if (signA * signB === -1) {
    result.push('-')
  }
  
  return result.reverse().join('')
}