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);
}
浙公网安备 33010602011771号