小伙伴们在做金融计算的时候会遇到精度丢失问题,虽然有插件库能过解决,但是我今天手写了函数来解决下面是例子:
// 加法 =====================
0.1 + 0.2 = 0.30000000000000004
0.7 + 0.1 = 0.7999999999999999
0.2 + 0.4 = 0.6000000000000001
// 减法 =====================
1.5 - 1.2 = 0.30000000000000004
0.3 - 0.2 = 0.09999999999999998
// 乘法 =====================
19.9 * 100 = 1989.9999999999998
0.8 * 3 = 2.4000000000000004
35.41 * 100 = 3540.9999999999995
// 除法 =====================
0.3 / 0.1 = 2.9999999999999996
0.69 / 10 = 0.06899999999999999
最直接的方法就是把它转化成整数,然后再运算就不会丢失精度了,在转化成整数的时候用字符串与数组的方法去做,不要用运算符去做,不然又是精度的恶性循环 下面是代码:
function precisionFun(a, b, type) {
const changeA = a.toString().split(".");
const changeB = b.toString().split(".");
const digit1 = changeA[1]?.length??0; //小数点后面位数
const digit2 = changeB[1]?.length??0; //小数点后面位数
const lenMax = Math.max(digit1, digit2); // 两位数小数中最大的小数位数
const intA = (changeA.join("") + "0".repeat(lenMax-digit1)) * 1; // 去掉小数点
const intB = (changeB.join("") + "0".repeat(lenMax-digit2)) * 1; // 去掉小数点
const result = {
add: (intA + intB) / 10 ** lenMax, // 加法
sub: (intA - intB) / 10 ** lenMax, // 加法
multiply: (intA * intB) / 10 ** (lenMax * 2), // 乘法
division: intA / intB // 出发
}
return result[type];
}
precisionFun(0.7, 0.1,'add') // 0.8
precisionFun(1.5, 1.223,'sub') // 0.277
precisionFun(0.58, 100,'multiply') // 58
precisionFun(0.69, 10,'division') // 0.069
哪里有不足,还望大神指点一下