原博文地址: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,保留指定小数位