在JavaScript中处理加减乘除运算时,可能会遇到精度问题,因为JavaScript 中的 Number 类型使用 IEEE 754 标准表示浮点数,这意味着在进行大数值计算时可能会出现精度下降的情况。
const dcm = {
add: function(num1=0, num2=0) {/*加法*/
var r1, r2, m;
try {
r1 = num1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = num2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (this.mul(num1, m) + this.mul(num2, m)) / m;
},
dre: function(num1=0, num2=0) {/*减法*/
var r1, r2, m;
try {
r1 = num1.toString().split('.')[1].length;
} catch (e) {
r1 = 0;
}
try {
r2 = num2.toString().split('.')[1].length;
} catch (e) {
r2 = 0;
}
m = Math.pow(10, Math.max(r1, r2));
return (this.mul(num1, m) - this.mul(num2, m)) / m;
},
mul: function(num1=0, num2=0) {/*乘法*/
var m = 0,s1 = num1.toString(),s2 = num2.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);
},
div: function(num1=0, num2=0) {/*除法*/
var t1 = 0,t2 = 0,r1, r2;
try {
t1 = num1.toString().split('.')[1].length;
} catch (e) {}
try {
t2 = num2.toString().split('.')[1].length;
} catch (e) {}
r1 = Number(num1.toString().replace('.', ''));
r2 = Number(num2.toString().replace('.', ''));
return (r1 / r2) * Math.pow(10, t2 - t1);
}
}
对比:
dcm.add(0.1,0.2);//结果:0.3
0.1+0.2;//结果:0.30000000000000004
dcm.dre(0.2,0.02);//结果:0.18
0.2-0.02;//结果:0.18000000000000002
dcm.mul(0.1,0.2);//结果:0.02
0.1*0.2;//结果:0.020000000000000004
这些方法可以提供一定程度的精度保证,但不能完全消除精度问题。在涉及到金融等高度精确计算的场景下,应该使用专门的金融库或者通过服务端计算。