js 浮點數計算精確度不許確的解決方案

原博文地址:https://www.cnblogs.com/zdz8207/p/js-number-tofixed.htmlhtml

12*1.2 != 14.4 獲得14.3999999git

0.1+0.2 != 0.3 獲得0.30000000000000004ide

爲何會這樣呢?this

原來js在計算浮點數時會先把浮點數轉換成二進制,其中會出現偏差,相加完再轉換乘十進制時又會出現偏差,吧啦吧啦吧啦,大概是這個緣由吧,不重要,重要的是解決方案,下面是加減乘除的解決方法,核心原理是將浮點數轉換成整數,再轉換成浮點數。spa

下面給出具體方法code

const computeFloat = {
  getDigits (num1, num2) {
    let d1, d2
    let d1Arr = (num1 + '').split('.')[1]
    let d2Arr = (num2 + '').split('.')[1]
    d1 = d1Arr ? d1Arr.length : 0
    d2 = d2Arr ? d2Arr.length : 0
    return { d1, d2 }
  },
  compute (num1, num2, type) {
    let { d1, d2 } = this.getDigits(num1, num2)
    switch (type) {
      case 'add':
        return this.add(num1, num2, d1, d2)
      case 'subtract':
        return this.subtract(num1, num2, d1, d2)
      case 'multiply':
        return this.multiply(num1, num2, d1, d2)
      case 'divide':
        return this.divide(num1, num2, d1, d2)
    }
  },
  add (num1, num2, d1, d2) {
    let m = Math.pow(10, Math.max(d1, d2))
    return (num1 * m + num2 * m) / m
  },
  subtract (num1, num2, d1, d2) {
    let m = Math.pow(10, Math.max(d1, d2))
    return (num1 * m - num2 * m) / m
  },
  multiply (num1, num2, d1, d2) {
    let m = Math.pow(10, d1 + d2)
    return ((num1 + '').replace('.', '')) * ((num2 + '').replace('.', '')) / m
  },
  divide (num1, num2, d1, d2) {
    let m = Math.pow(10, d2-d1)
    return ((num1 + '').replace('.', '')) / ((num2 + '').replace('.', '')) * m
  }
}

使用的時候是這樣的:htm

加:blog

computeFloat.compute(0.1,0.2,'add')

 固然,若是對結果精確度要求不嚴格,能夠用toFixed,保留指定小數位ip

相關文章
相關標籤/搜索