JavaScript 中的 BigInt 類型

Number 的安全范圍

和別的強(qiáng)類型編程語言(比如說 C古掏,Java)不同损话,JavaScript 不區(qū)分整數(shù)值和浮點數(shù)值。
我們可以發(fā)現(xiàn)10 === 10.0 // true槽唾。那是因為 JavaScript 的數(shù)字類型是基于 IEEE 754 標(biāo)準(zhǔn)中的"雙精度"格式丧枪,也就是 64 位二進(jìn)制來實現(xiàn)的,它是通過如下格式來存儲數(shù)據(jù)庞萍。

ieee-754.png

符號位(Sign bit): 1 bit(0 表示正數(shù)拧烦, 1 表示負(fù)數(shù))
指數(shù)位(Exponent): 11 bits
有效數(shù)字(Significand precision): 53 bits (52 explicitly stored)在二進(jìn)制中,計算機(jī)內(nèi)部保存有效數(shù)字時钝计,第一個有效數(shù)字必定是1恋博,因此這個1并不會存儲齐佳。所以52位有效數(shù)字可以存儲53位。

這里可以提到的的一點是:二進(jìn)制浮點數(shù)最大的問題就是在處理0.1 + 0.2的時候债沮,實際上的結(jié)果不是0.3炼吴,而是一個比較接近的數(shù)字0.30000000000000004,這也是因為在它計算的時候,會先轉(zhuǎn)化為二進(jìn)制疫衩,再進(jìn)行計算導(dǎo)致的偏差硅蹦。因為我們在用 JavaScript 或者其他遵循 IEEE 754 規(guī)范的語言處理帶有效數(shù)的數(shù)字時要特別注意。

JavaScript 的數(shù)字格式也就決定了 JavaScript 能夠安全表示的整數(shù)范圍是 -2^53+1 ~ 2^53-1闷煤。
這里我們可以先明確一下“安全”的概念:

  1. 可以準(zhǔn)確地表示為一個 IEEE-754 雙精度數(shù)字
  2. 其 IEEE-754 表示不能是舍入任何其他整數(shù)以適應(yīng) IEEE-754 表示的結(jié)果
    比如說:比如童芹,2^53 - 1 是一個安全整數(shù),它能被精確表示鲤拿,在任何 IEEE-754 舍入模式(rounding mode)下假褪,沒有其他整數(shù)舍入結(jié)果為該整數(shù)。作為對比皆愉,2^53 就不是一個安全整數(shù)嗜价,它能夠使用 IEEE-754 表示,但是 2^53 + 1 不能使用 IEEE-754 直接表示幕庐,在就近舍入(round-to-nearest)和向零舍入中久锥,會被舍入為 2^53

可以參考Number.isSafeInteger()的定義异剥。

BigInt 類型

在 ES2020 之前瑟由,JavaScript 只有一種數(shù)值類型:number(數(shù)字),而之后為了安全表達(dá)比 -9007199254740991 ~ 9007199254740991安全范圍之外的數(shù)字冤寿。引入了BigInt類型歹苦。
一般計算機(jī)是將整數(shù)存儲在 CPU 的寄存器中(現(xiàn)在通常是 32 位或 64 位寬, JS 是 64bit)督怜,或者存儲在寄存器大小的內(nèi)存塊中殴瘦,這就會帶來安全范圍的問題。而 BigInt 類型為了保證精度号杠。它是在內(nèi)存中分配一個對象蚪腋。我們讓它足夠大,以一系列塊的形式容納所有 BigInt 的位姨蟋,我們稱之為“數(shù)字”
https://v8.dev/blog/bigint

如何使用

  1. 直接在數(shù)字后面加一個n
  2. 調(diào)用BigInt()構(gòu)造函數(shù)
const bigInt = 9007199254740992n; //通過直接在數(shù)字后面加n
const bigNumber = BigInt(9007199254740992); // 對十進(jìn)制數(shù)字使用BigInt函數(shù)
const bigString = BigInt("9007199254740992"); //對String類型的使用BigInt函數(shù)屉凯,先隱式轉(zhuǎn)換為十進(jìn)制的數(shù)字,再顯式轉(zhuǎn)換為BigIn類型
const bigHex = BigInt(0x20000000000000); // 對十六進(jìn)制數(shù)字使用BigInt函數(shù)
const bigBin = BigInt(0b100000000000000000000000000000000000000000000000000000); //對二進(jìn)制數(shù)字使用BigInt函數(shù)

以上這些運算生成的值都是9007199254740992n;

BigInt類型運算

可用操作符

BigInt 中可以運用如下操作符:

符號 名稱
+ 加法
* 乘法
- 減法
% 求余
** 求冪
<< 左移位
>> 右移位
  1. 當(dāng) BigInt 使用/操作符時眼溶,帶小數(shù)的運算會被取整悠砚。
const expected = 4n / 2n; //2n
const rounded = 5n / 2n; //2n, not 2.5n
  1. 因為 BigInt 都是有符號的, >>> (無符號右移)不能用于 BigInt

運算注意事項

BigInt 類型雖然和 Number 很像,可以做各種數(shù)學(xué)運算堂飞,但是在運算過程中要注意兩點:

  1. BigInt 類型不能用 Math 對象中的方法灌旧。
  2. 不能和 Number 示例混合運算绑咱。因為 JavaScript 在處理不同類型的運算時,會把他們先轉(zhuǎn)換為同一類型节榜,而 BigInt 類型變量在被隱式轉(zhuǎn)換為 Number 類型時羡玛,可能會丟失精度,或者直接報錯宗苍。
const number = 1;
const bigInt = 9007199254740993n;
number + bigInt; //  TypeError: Cannot mix BigInt and other types

BigInt類型和其他類型比較

BigInt 類型的比較和 JavaScript 中的其他類型比較一樣,分為寬松相等和嚴(yán)格相等薄榛。

const bigInt = 2n;
const int = 2;
const string = "2";
bigInt == int; // true
bigInt == string; // true

bigInt === int; // false
bigInt === string; //false
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讳窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子敞恋,更是在濱河造成了極大的恐慌丽啡,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硬猫,死亡現(xiàn)場離奇詭異补箍,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啸蜜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門坑雅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衬横,你說我怎么就攤上這事裹粤。” “怎么了蜂林?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵遥诉,是天一觀的道長。 經(jīng)常有香客問我噪叙,道長矮锈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任睁蕾,我火速辦了婚禮苞笨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惫霸。我一直安慰自己猫缭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布壹店。 她就那樣靜靜地躺著猜丹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪硅卢。 梳的紋絲不亂的頭發(fā)上射窒,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天藏杖,我揣著相機(jī)與錄音,去河邊找鬼脉顿。 笑死蝌麸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艾疟。 我是一名探鬼主播来吩,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔽莱!你這毒婦竟也來了弟疆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盗冷,失蹤者是張志新(化名)和其女友劉穎怠苔,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仪糖,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡柑司,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了锅劝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攒驰。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鸠天,靈堂內(nèi)的尸體忽然破棺而出讼育,到底是詐尸還是另有隱情,我是刑警寧澤稠集,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布奶段,位于F島的核電站,受9級特大地震影響剥纷,放射性物質(zhì)發(fā)生泄漏痹籍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一晦鞋、第九天 我趴在偏房一處隱蔽的房頂上張望蹲缠。 院中可真熱鬧,春花似錦悠垛、人聲如沸线定。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斤讥。三九已至,卻和暖如春湾趾,著一層夾襖步出監(jiān)牢的瞬間芭商,已是汗流浹背派草。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铛楣,地道東北人近迁。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像簸州,于是被迫代替她去往敵國和親鉴竭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內(nèi)容