js的小數的運算,可能會得到一個不精確的結果,因為所有的運算都要轉換成二進制去計算,然而,二進制無法精確表示1/10。
var a = 0.1 + 0.2;
console.log(a); //打印結果:0.30000000000000004
因此需要使用以下方法實現精確計算:
加
// 兩個浮點數求和function accAdd(num1,num2){var r1,r2,m;try{r1 = num1.toString().split('.')[1].length;}catch(e){r1 = 0;}try{r2=num2.toString().split(".")[1].length;}catch(e){r2=0;}m=Math.pow(10,Math.max(r1,r2));// return (num1*m+num2*m)/m;return Math.round(num1*m+num2*m)/m;}
減
// 兩個浮點數相減function accSub(num1,num2){var r1,r2,m;try{r1 = num1.toString().split('.')[1].length;}catch(e){r1 = 0;}try{r2=num2.toString().split(".")[1].length;}catch(e){r2=0;}m=Math.pow(10,Math.max(r1,r2));n=(r1>=r2)?r1:r2;return (Math.round(num1*m-num2*m)/m).toFixed(n);}
乘
// 兩數相乘function accMul(num1,num2){var m=0,s1=num1.toString(),s2=num2.toString(); try{m+=s1.split(".")[1].length}catch(e){};try{m+=s2.split(".")[1].length}catch(e){};return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);}
除
// 兩數相除function accDiv(num1,num2){var t1,t2,r1,r2;try{t1 = num1.toString().split('.')[1].length;}catch(e){t1 = 0;}try{t2=num2.toString().split(".")[1].length;}catch(e){t2=0;}r1=Number(num1.toString().replace(".",""));r2=Number(num2.toString().replace(".",""));return (r1/r2)*Math.pow(10,t2-t1);}