小数相加丢失精确度,0.1+0.2不等于0.3

63 阅读1分钟

截屏2023-06-30 14.59.44.png

this.num = this.dcmAdd(0.1, 0.2)//0.3
 //处理浮点数相加丢失精确度
    dcmAdd(arg1, arg2) {
      var r1, r2, m
      try {
        r1 = arg1.toString().split('.')[1].length
      } catch (e) {
        r1 = 0
      }
      try {
        r2 = arg2.toString().split('.')[1].length
      } catch (e) {
        r2 = 0
      }
      m = Math.pow(10, Math.max(r1, r2))
      return (this.accMul(arg1, m) + this.accMul(arg2, m)) / m
    },
    //处理浮点数相加丢失精确度
    accMul(arg1, arg2) {
      var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.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)
    },

方法二:

import Decimal from 'decimal.js'

//减
let delValue = new Decimal(curTotal).sub(new Decimal(curValue)).toNumber()

//加
new Decimal(pre).add(new Decimal(+cur.invoiceTotalFee)).toNumber()