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

BFE.devAI解答 - JavaScript 代码题
127. BigDecimal 减法

解题思路:

  • 首先把被减数和减数分开为整数部分和小数部分;
  • 如果有小数部分,那么需要在小数部分后面补零,使得被减数和减数的小数部分位数相等,便于后面相减;
  • 在整数部分和小数部分分别相减,需要借位的话从高位向低位进行借位,然后从低位向高位进行相减;
  • 最后,把整数部分和小数部分相加得到最终的结果;
  • 最终结果的结尾的0需要去掉。

具体实现见下方代码:

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
function subtract(num1, num2) {
  // 将 num1 和 num2 分离为整数部分和小数部分
  let [int1, dec1 = ''] = num1.split('.');
  let [int2, dec2 = ''] = num2.split('.');

  // 补齐小数部分的位数
  while (dec1.length < dec2.length) dec1 += '0';
  while (dec2.length < dec1.length) dec2 += '0';

  // 分别计算整数部分和小数部分的结果
  let intResult = subtractHelper(int1, int2);
  let decResult = subtractHelper(dec1, dec2);

  // 处理借位
  let result = '';
  let borrow = 0; // 借位标志位
  let len = decResult.length;

  for (let i = len - 1; i >= 0; i--) {
    let x = decResult[i] - borrow;
    let y = i >= len - dec1.length ? dec1[i - (len - dec1.length)] : '0';
    if (x < y) {
      borrow = 1;
      result = String(x + 10 - y) + result;
    } else {
      borrow = 0;
      result = String(x - y) + result;
    }
  }

  // 处理整数部分
  intResult = subtractHelper(intResult, borrow);

  // 拼接整数部分与小数部分,去掉前导0
  result = intResult + (result ? '.' + result.replace(/0+$/, '') : '');

  // 处理负号
  if (result.charAt(0) === '.') result = '0' + result;
  if (int1.charAt(0) === '-' && int2.charAt(0) !== '-') result = '-' + result;

  return result;
}

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
function subtractHelper(num1, num2) {
  let sign = '';
  if (num1.charAt(0) === '-' && num2.charAt(0) !== '-') {
    return add(num1.substr(1), num2);
  }
  if (num1.charAt(0) !== '-' && num2.charAt(0) === '-') {
    return add(num1, num2.substr(1));
  }
  if (num1.charAt(0) === '-' && num2.charAt(0) === '-') {
    sign = '-';
    num1 = num1.substr(1);
    num2 = num2.substr(1);
  }
  if (num1.length < num2.length || (num1.length === num2.length && num1 < num2)) {
    sign = '-';
    let temp = num1;
    num1 = num2;
    num2 = temp;
  }
  let result = '';
  let len1 = num1.length;
  let len2 = num2.length;
  let diff = len1 - len2;
  let borrow = 0; // 借位标志位
  for (let i = len2 - 1; i >= 0; i--) {
    let x = num1[i + diff] - borrow;
    let y = num2[i];
    if (x < y) {
      borrow = 1;
      result = String(x + 10 - y) + result;
    } else {
      borrow = 0;
      result = String(x - y) + result;
    }
  }
  for (let i = diff - 1; i >= 0; i--) {
    let x = num1[i] - borrow;
    if (x < 0) {
      borrow = 1;
      result = String(x + 10) + result;
    } else {
      borrow = 0;
      result = String(x) + result;
    }
  }
  return sign + (borrow ? '1' : '') + result.replace(/^0+/, '') || '0';
}

/**
 * @param {string} num1
 * @param {string} num2
 * @return {string}
 */
function add(num1, num2) {
  let sign = '';
  if (num1.charAt(0) === '-' && num2.charAt(0) === '-') {
    num1 = num1.substr(1);
    num2 = num2.substr(1);
    sign = '-';
  } else if (num1.charAt(0) === '-') {
    return subtract(num2, num1.substr(1));
  } else if (num2.charAt(0) === '-') {
    return subtract(num1, num2.substr(1));
  }
  let result = '';
  let len1 = num1.length;
  let len2 = num2.length;
  let carry = 0;
  for (let i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0 || carry; i--, j--) {
    let x = +num1[i] || 0;
    let y = +num2[j] || 0;
    let sum = x + y + carry;
    if (sum >= 10) {
      carry = 1;
      result = String(sum - 10) + result;
    } else {
      carry = 0;
      result = String(sum) + result;
    }
  }
  return sign + result;
}