精度问题的封装

91 阅读1分钟

tt-one.webp

加法

function addAccuracy(arg1, arg2) {
    let r1, r2, m
    try {
      r1 = arg1.toString().split('.')[1].length
    } catch (error) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split('.')[1].length
    } catch (error) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m + arg2 * m) / m
  }

减法

function subAccuracy(arg1, arg2) {
    let r1, r2, m
    try {
      r1 = arg1.toString().split('.')[1].length
    } catch (error) {
      r1 = 0
    }
    try {
      r2 = arg2.toString().split('.')[1].length
    } catch (error) {
      r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2))
    return (arg1 * m - arg2 * m) / m
  }

乘法

 //小数相乘,小数点后个数相加
function mulAccuracy(arg1, arg2) {
    let m = 0
    let r1 = arg1.toString()
    let r2 = arg2.toString()

    try {
      m += r1.split('.')[1].length // 小数相乘,小数点后个数相加
    } catch (e) {}
    try {
      m += r2.split('.')[1].length
    } catch (e) {}
    return (
      (Number(r1.replace('.', '')) * Number(r2.replace('.', ''))) /
      Math.pow(10, m)
    )
  }

除法

/*
    将除法转化成乘法
    乘以小数点后个数差
*/
   function divisionAccuracy(arg1, arg2) {
    let m1 = 0
    let m2 = 0
    let n1 = 0
    let n2 = 0
    try {
      m1 = arg1.toString().split('.')[1].length
    } catch (error) {}
    try {
      m2 = arg2.toString().split('.')[1].length
    } catch (error) {}
    n1 = Number(arg1.toString().replace('.', ''))
    n2 = Number(arg2.toString().replace('.', ''))
    /*
      必须要是 m2 - m1 原因: 因为我们需要将被除数的先变成整数在进行运算, 所以这里必须要是 m2 - m1
      0.3 / 0.01 我们必须要将0.01 先变成1 此时 0.3变成了一个30
    */
    return mulAccuracy(n1 / n2, Math.pow(10, m2 - m1))
  }

导出

export { addAccuracy, subAccuracy, mulAccuracy, divisionAccuracy }