js基本數據類型 BigInt 和 Number 的區別

今天在作LeetCode的一到 「加一」 的題,題目以下git

給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。

最高位數字存放在數組的首位, 數組中每一個元素只存儲一個數字。

你能夠假設除了整數 0 以外,這個整數不會以零開頭。

示例 1:

輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例 2:

輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。

個人代碼是這樣的,這仍是優化過的chrome

var plusOne = function(digits) {
  for (let i = digits.length - 1; i >= 0; i--) {
    if (digits[i] === 9) {
      digits[i] = 0
    } else {
      digits[i]++
      break
    }
  }
  return (digits[0] === 0) ? [...[1], ...digits] : digits
};

後來在答案區看到一位大神的代碼只有一行數組

const plusOne = digits => {
  return (BigInt(digits.join('')) + 1n).toString().split('');
};

趕忙學習一下,安全

這個方法很巧妙,是把數組轉化爲數字計算後再轉回數組函數

方法學習到了,可是爲何不能用Number呢,我測試了一下,當數字過大時,Number的問題就出現了學習

var plusOne1 = function(digits) {
    (Number(digits.join(''))+1).toString().split('')
    return digits
};
var plusOne2 = digits => {
  return (BigInt(digits.join('')) + 1n).toString().split('');
};

plusOne1([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3])
// [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,0,0,0]

plusOne2([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3])
// [6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,4]

再來下面的就更清晰了
Number([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705000
BigInt([6,1,4,5,3,9,0,1,9,5,1,8,6,7,0,5,5,4,3].join('')) = 6145390195186705543n

 爲何Number不行,BigInt就能夠呢,咱們來看一下BigInt的介紹測試

在JavaScript中的基本數據類Number是雙精度浮點數,它能夠表示的最大安全範圍是正負9007199254740991,也就是2的53次方減一, 比253大的全部數字則可使用BigInt表達。優化

BigInt是JavaScript中的一個新的原始類型,能夠用任意精度表示整數。使用BigInt,即便超出JavaScript Number 的安全整數限制,也能夠安全地存儲和操做大整數。spa

chrome 67+開始支持BigInt。能夠這樣定義一個 BigInt 變量:在一個整數字面量後面加 n,如:10n,或者調用函數BigInt()code

要建立一個BigInt,在數字後面添加n後綴便可,例如,123變成123n。全局BigInt(number)函數能夠用來將Number轉換成BigInt。換句話說,BigInt(123) === 123n

BigInt(value)。   
//  value是建立對象的數值。能夠是字符串或者整數。
const theBiggestInt = 9007199254740991n;

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

const hugeButString = BigInt('9007199254740991');
// ↪ 9007199254740991n

 

它在某些方面相似於 Number ,可是也有幾個關鍵的不一樣點:不能和 Math 對象中的方法一塊兒使用;不能和任何 Number 實例混合運算。

好了,如今你知道他們的區別在哪裏了嗎?若是工做中有對超大數字的計算,必定記得使用BigInt確保準確無誤哦!

相關文章
相關標籤/搜索