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