原博文地址: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