JS經典問題:0.1+0.2!=0.3
為什么會造成精度丟失?
核心:因為JS遵守IEEE 754采用雙精度存儲,又因為JS最大位數是52位,最大數是2^53,而數字轉成二進制時大於52位,后面的位數就會被舍棄,導致累加后就造成精度丟失。
解決方式
1.對結果進行解決
//number:結果(如:0.3111111) //len:需要保留幾位小數 function toFixed(number,len){ //需要n位小數就乘以n倍 const ceil = Math.pow(10,len); //加0.5是為了四舍五入 const intNum = number*ceil+0.5; //再除以n倍 const result = parseInt(intNum,10)/ceil; return result }
2.對過程進行解決
//frontNum 第一個數 //endNum 第二個數 //action 操作符 function changeNumber(frontNum, endNum, action) { //數字轉成字符串判斷位數大小 const maxLen = Math.max((frontNum + "").length, (endNum + "").length); //-2是因為存在"0"和"." const maxCeil = Math.pow(10, maxLen - 2); let result; if (action == '+') { result = ((frontNum * maxCeil) + (endNum * maxCeil)) / maxCeil; } //....除 減... return result }