js 浮点数计算精确度不准确的解决方案

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

12*1.2 != 14.4 得到14.3999999

0.1+0.2 != 0.3 得到0.30000000000000004

为什么会这样呢?

原来js在计算浮点数时会先把浮点数转换成二进制,其中会出现误差,相加完再转换乘十进制时又会出现误差,吧啦吧啦吧啦,大概是这个原因吧,不重要,重要的是解决方案,下面是加减乘除的解决方法,核心原理是将浮点数转换成整数,再转换成浮点数。

下面给出具体方法

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
  }
}

使用的时候是这样的:

加:

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

 当然,如果对结果精确度要求不严格,可以用toFixed,保留指定小数位

posted @ 2019-04-23 18:17  如斯~  阅读(669)  评论(0编辑  收藏  举报