以下为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;}