大数或者小数乘法-精度

101 阅读1分钟
function multiply(num1, num2) {
	if (isNaN(num1) || isNaN(num2)) return '';
	if (num1 === '0' || num2 === '0') return '0';

	let l1 = num1.length,
		l2 = num2.length;

	let result = [];

	for (let i = l1 - 1; i >= 0; i--) {
		for (let j = l2 - 1; j >= 0; j--) {
			let index1 = i + j;
			let index2 = i + j + 1;

			let product = num1[i] * num2[j] + (result[index2] || 0);
			result[index2] = product % 10;
			result[index1] = Math.floor(product / 10) + (result[index1] || 0);
		}
	}
	return result.join('').replace(/^0+/, '');
}
function accMul(arg1, arg2) {
	if (arg1) {
		let s1 = arg1.toString().trim();
		let s2 = arg2.toString().trim();
		let pre = '';
		const s1Firststr = s1[0];
		if (isNaN(Number(s1Firststr))) {
			s1 = s1.slice(1);
		}
		const s2Firststr = s2[0];
		if (isNaN(Number(s2Firststr))) {
			s2 = s2.slice(1);
		}
		if ((s2Firststr == '-') ^ (s1Firststr == '-')) {
			pre = '-';
		}
		let index1 = s1.indexOf('.');
		let index2 = s2.indexOf('.');
		let dotlen = 0;
		if (index1 != -1) {
			dotlen += s1.length - index1 - 1;
		}
		if (index2 != -1) {
			dotlen += s2.length - index2 - 1;
		}
		s1 = s1.replace('.', '');
		s2 = s2.replace('.', '');
		let res = multiply(s1, s2);
		if (dotlen) {
			const reslen = res.length;
			if (reslen <= dotlen) {
				res = '0'.repeat(dotlen) + res;
				res = `0.${res.slice(-dotlen)}`;
			} else {
				res = [res.slice(0, reslen - dotlen), res.slice(-dotlen)].join('.');
			}
		}
		return pre + res;
	}
	return '';
}
export default accMul;