js基本数据类型 BigInt 和 Number 的区别
今天在做LeetCode的一到 “加一” 的題,題目如下
給定一個由整數(shù)組成的非空數(shù)組所表示的非負(fù)整數(shù),在該數(shù)的基礎(chǔ)上加一。 最高位數(shù)字存放在數(shù)組的首位, 數(shù)組中每個元素只存儲一個數(shù)字。 你可以假設(shè)除了整數(shù) 0 之外,這個整數(shù)不會以零開頭。 示例 1: 輸入: [1,2,3] 輸出: [1,2,4] 解釋: 輸入數(shù)組表示數(shù)字 123。 示例 2: 輸入: [4,3,2,1] 輸出: [4,3,2,2] 解釋: 輸入數(shù)組表示數(shù)字 4321。
我的代碼是這樣的,這還是優(yōu)化過的
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
};
后來在答案區(qū)看到一位大神的代碼只有一行
const plusOne = digits => {
return (BigInt(digits.join('')) + 1n).toString().split('');
};
趕緊學(xué)習(xí)一下,
這個方法很巧妙,是把數(shù)組轉(zhuǎn)化為數(shù)字計算后再轉(zhuǎn)回數(shù)組
方法學(xué)習(xí)到了,但是為什么不能用Number呢,我測試了一下,當(dāng)數(shù)字過大時,Number的問題就出現(xiàn)了
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中的基本數(shù)據(jù)類Number是雙精度浮點(diǎn)數(shù),它可以表示的最大安全范圍是正負(fù)9007199254740991,也就是2的53次方減一, 比253大的所有數(shù)字則可以使用BigInt表達(dá)。
BigInt是JavaScript中的一個新的原始類型,可以用任意精度表示整數(shù)。使用BigInt,即使超出JavaScriptNumber的安全整數(shù)限制,也可以安全地存儲和操作大整數(shù)。
chrome 67+開始支持BigInt。可以這樣定義一個BigInt變量:在一個整數(shù)字面量后面加n,如:10n,或者調(diào)用函數(shù)BigInt()。
要創(chuàng)建一個BigInt,在數(shù)字后面添加n后綴即可,例如,123變成123n。全局BigInt(number)函數(shù)可以用來將Number轉(zhuǎn)換成BigInt。換句話說,BigInt(123) === 123n。
BigInt(value)。 // value是創(chuàng)建對象的數(shù)值。可以是字符串或者整數(shù)。
const theBiggestInt = 9007199254740991n;
const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n
const hugeButString = BigInt('9007199254740991');
// ↪ 9007199254740991n
它在某些方面類似于Number,但是也有幾個關(guān)鍵的不同點(diǎn):不能和Math對象中的方法一起使用;不能和任何Number實(shí)例混合運(yùn)算。
好了,現(xiàn)在你知道他們的區(qū)別在哪里了嗎?如果工作中有對超大數(shù)字的計算,一定記得使用BigInt確保準(zhǔn)確無誤哦!
總結(jié)
以上是生活随笔為你收集整理的js基本数据类型 BigInt 和 Number 的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何进行大规模在线数据迁移(来自Stri
- 下一篇: 一般纳税人和小规模纳税人哪个好?哪个更划