js中精度丢失问题解决

288 阅读1分钟

src=http___wx3.sinaimg.cn_bmiddle_006APoFYly1g5qbj8l2z5g30dc0dcwfo.gif&refer=http___wx3.sinaimg.gif

小伙伴们在做金融计算的时候会遇到精度丢失问题,虽然有插件库能过解决,但是我今天手写了函数来解决下面是例子:

// 加法 =====================
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

哪里有不足,还望大神指点一下