解决JavaScript浮点数计算时出现的误差
解决JavaScript浮点数计算时出现的误差
JavaScript 浮点数计算时,因为精度问题,会出现误差,下边就是解决误差的方法:
/**
* 用来进行小数位浮点数据相加数据出现误差的加减方法
* @param {*} num1
* @param {*} num2
* @param {*} way 1 为加法,0 为减法。默认为加法
*/
function filterCalcNum(num1, num2, way = 1) {
let sq1, sq2, multiple;
try {
sq1 = num1.toString().split(".")[1].length;
} catch (e) {
sq1 = 0;
}
try {
sq2 = num2.toString().split(".")[1].length;
} catch (e) {
sq2 = 0;
}
multiple = Math.pow(10, Math.max(sq1, sq2) + 1);
if (way) {
return (num1 * multiple + num2 * multiple) / multiple;
} else {
return (this.filterCalcMulNum(num1, multiple) - this.filterCalcMulNum(num2, multiple)) / multiple;
}
},
/**
* 解决浮点数乘法时,有误差问题
* @param {*} num1
* @param {*} num2
* @param {*} way 1, 乘法,2 除法
* @returns
*/
function filterCalcMulNum(num1, num2, way = 1) {
let s1, s2, m = 0,
r1, r2, t1, t2;
s1 = num1.toString();
s2 = num2.toString();
try {
m += s1.split(".")[1].length
t1 = s1.split(".")[1].length;
} catch (e) {
sq1 = 0;
}
try {
m += s2.split(".")[1].length
t2 = s2.split(".")[1].length
} catch (e) {
sq2 = 0;
}
if (way) {
return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
} else {
r1 = Number(num1.toString().replace(".", ""))
r2 = Number(num2.toString().replace(".", ""))
return (r1 / r2) * Math.pow(10, t2 - t1);
}
},