js進行部分小數運算時,會出現精度問題。

解決思路是,把小數同時擴大為10的x冪,返回計算完畢后,再縮小為10的x冪。
在Math方法上添加加減乘除方法。
let extentFns = ['add', 'sub', 'mul', 'div']; //運算函數 function ufunc(type, arg){ var decimalDigits = []; //要計算的小數位數數組 //獲取小數點的位數 for(let index in arg){ let digit = 0; try { digit = arg[index].toString().split(".")[1].length; }catch (e) { digit = 0; } decimalDigits.push(digit); } //找到最大的位數 decimalDigits.sort( (a, b)=> a - b ); let maxDigit = decimalDigits[decimalDigits.length - 1]; let m = Math.pow(10, maxDigit);//小數轉換成整數需要擴大的倍數 let result = 0; switch(type){ case 'add': for(let index in arg){ result += arg[index] * m; } return result / m; break; case 'sub': for(let index in arg){ if(index == 0){ result = arg[index] * m - result; }else{ result -= arg[index] * m } } return result / m; break; case 'mul': result = 1; for(let index in arg){ if(index == 0){ result = arg[index] * m * result; }else{ result *= arg[index] * m } } return result / m; break; case 'div': result = 1; for(let index in arg){ if(index == 0){ result = arg[index] * m / result; }else{ result /= arg[index] * m } } return result / m; break; default: break; } } Math.ufunc = ufunc; //掛載到Math上 // Math.add1 = add1; for(let i = 0; i < extentFns.length; i++){ Math[extentFns[i]] = function(){ return this.ufunc(extentFns[i], arguments); }; } //參數可以連續傳遞 Math.add(0.1, 0.2, 0.3, ....); console.log( Math.add(0.1,0.2)); //0.3 console.log( Math.sub(0.12,0.2)); console.log( Math.mul(0.2,0.4)); console.log( Math.div(0.2,0.04));
想使用時引入這個js文件即可在Math方法上找到這幾個函數了。
