This solution is generated by ChatGPT, correctness is not guaranteed.
AI solution for JavaScript Coding Question on BFE.dev
129. BigDecimal Division
Solution using long division algorithm:
function divide(dividend, divisor) {
const MAX_PRECISION = 20; // the maximum digits after decimal point
let sign = 1; // the sign of quotient
if(dividend[0] == '-') {
sign = -sign;
dividend = dividend.slice(1);
}
if(divisor[0] == '-') {
sign = -sign;
divisor = divisor.slice(1);
}
// remove leading/trailing zeros
dividend = dividend.replace(/^0+/, '').replace(/\.?0+$/, '');
divisor = divisor.replace(/^0+/, '').replace(/\.?0+$/, '');
if(divisor == '0') throw new Error('Divide by zero');
if(dividend == '0') return '0';
let q = '', r = ''; // quotient and remainder
for(let i = 0; i < dividend.length; i++) {
let d = Number(dividend[i]);
let n = r.length == 0 ? d : Number(r + d.toString()); // pick digit from dividend or remainder
let qn = Math.floor(n / Number(divisor));
q += qn.toString();
r = (n - qn*Number(divisor)).toString(); // update remainder
if(q.length == MAX_PRECISION) break; // precision limit reached
}
if(r.length == 0) return (sign == -1 ? '-' : '') + q; // exact division
// long division for non-terminating decimals
if(q.length == 0) q = "0";
q += '.';
while(r.length > 0 && q.length < MAX_PRECISION+2) {
r += '0'; // pad with zeros
let n = Number(r);
let qn = Math.floor(n / Number(divisor)); // quotient of next digit
q += qn.toString();
r = (n - qn*Number(divisor)).toString(); // update remainder
}
// remove trailing zeros
q = q.replace(/\.?0+$/, '');
if(q.endsWith('.')) q = q.slice(0, -1);
return (sign == -1 ? '-' : '') + q;
}