js 如何决绝浮点数计算的精度问题

有时候js浮点数加减乘除经常得出,4-1.09 = 2.9100000000002这种哭笑不得的结果,然后又因为截取的问题,经常到账在计算金额类的问题的时候产生1分钱误差的场景。

下面封装一个库解决浮点数加减乘除计算问题。

/**
js 数学计算封装,用来解决小数计算精度问题
*/
// 加法计算
function bcadd (num1, num2) {
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return 0;
	var r1 = 0, r2 = 0;
	try {
  		r1 = num1.toString().split(".")[1].length;
	} catch (e) {
	}
	try {
  		r2 = num2.toString().split(".")[1].length;
	} catch (e) {
	}
	var n = Math.pow(10, Math.max(r1, r2));
	return (num1 * n + num2 * n) / n;
}

// 减法计算
function bcsub(num1, num2) {  
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return 0;
	var r1 = 0, r2 = 0;
	try {
  		r1 = num1.toString().split(".")[1].length;
	} catch (e) {
	}
	try {
  		r2 = num2.toString().split(".")[1].length;
	} catch (e) {
	}
	var m = Math.pow(10, Math.max(r1, r2));
  	return (num1 * m - num2 * m) / m;
}

// 乘法计算
function bcmul(num1, num2) { 
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return 0; 
	var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
	try {
  		m += s1.split(".")[1].length
	} catch (e) {
	}
	try {
	   m += s2.split(".")[1].length
	} catch (e) {
	}
	return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

// 除法计算
function bcdiv(arg1, arg2) {
	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return 0;
	var t1 = 0, t2 = 0, r1, r2;
	try {
		t1 = arg1.toString().split(".")[1].length
	} catch (e) {
	}
	try {
		t2 = arg2.toString().split(".")[1].length
	} catch (e) {
	}
	r1 = Number(arg1.toString().replace(".", ""));
	r2 = Number(arg2.toString().replace(".", ""));
	return (r1 / r2) * Math.pow(10, t2 - t1);
}

  

posted @ 2023-08-04 15:02  cnlovefish  阅读(34)  评论(0)    收藏  举报