解決JS精度丟失問題


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
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM