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
- 接下來就是重復上述的操作,直到計算結束。
注意:
~是按位取反的意思,計算機里面處理二進制數據時候的非,~~就是再轉回來,利用兩個按位取反的符號,進行類型的轉換,轉換成數字符號。