js - 超大整數相加


js 和任何一門語言一樣,對其數值的范圍有限制。

Number.MAX_VALUE // 1.7976931348623157e+308
Number.MAX_SAFE_INTEGER // 9007199254740991
Number.MIN_VALUE // 5e-324
Number.MIN_SAFE_INTEGER // -9007199254740991

如果我們想要對一個超大的整數(> Number.MAX_SAFE_INTEGER)進行加法運算,但是又想輸出一般形式,那么使用 + 是無法達到的,一旦數字超過 Number.MAX_SAFE_INTEGER 數字會被立即轉換為科學計數法,並且數字精度相比以前將會有誤差。在此時就需要自己實現一套加法算法。

function sumBigNums(a,b){
   let carry = 0, res = ' ';
   a = a.split("");
   b = b.split("");
   while(a.length || b.length || carry){
        carry += ~~a.pop() + ~~b.pop();
        res = (carry%10) + res;
        carry = carry > 9;
   }
   return res.replace(/^0+/, '');

}

代碼思路:

  • 首先用字符串的形式來保存大數,保證了其在數學表示上不會發生變化
  • 初始化res, carry變量來保存中間計算的結果,在將兩個字符串split為數組,以便進行每一位的運算
  • 循環的第一次就是進行 "個位" 的運算,將二者最末尾的兩個數相加,由於每一位數字是0 - 9,所以需要進行進位,在進過取余數操作后,將結果保留在個位。
  • 判斷 temp 是否大於 10,若是則將 temp 賦值為 true,等等,為什么要賦值成布爾值,不要着急,魔法即將發生。
  • 在兩個大數中的還有一個數字沒有參與運算,或者前一次運算發生進位后,進行下一次循環。
  • 接着除了對新的兩個數字相加還要加上 temp,若上次發生了進位,則此時 temp 為 true,Js因為存在隱式轉換,所以 true 轉換為 1,我們借用 Js 的類型轉換,完成了邏輯上的逢10進1操作。Amazing
  • 接下來就是重復上述的操作,直到計算結束。

注意:
~是按位取反的意思,計算機里面處理二進制數據時候的非,~~就是再轉回來,利用兩個按位取反的符號,進行類型的轉換,轉換成數字符號。


免責聲明!

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



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