Big Integer in JavaScript

應該很多人都知道 JavaScript 的數值型別沒有整數,一併都是 double precision 64-bit 浮點數。但實際運作起來還是很討厭啊:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
> b = parseInt('9007199254740992', 10); // 2^53
9007199254740992
> typeof(b);
'number'
> b + 1;
9007199254740992
> b = parseInt('9007199254740994', 10);
9007199254740994
> typeof(b);
'number'
> b + 1;
9007199254740996
> 'wtf?'
'wtf?'
> b = parseInt('18446744073709551616', 10); // 2^64
18446744073709552000
> isNaN(b)
false
> isFinite(b);
true

Reference: http://ecma262-5.com/ELS5_HTML.htm#Section_8.5

其實已經不準確了,但沒有錯誤訊息。這裡我本想做的事情是 JSON parse/stringify facebook user id,據 Facebook blog 說的長度是 64 bits. 當然會有人建議乾脆存成字串啦,但除非移民太空,不然其實不可能超過 64 了。在找支援的套件時,都不是很熱門,感覺怕怕的。後來看到 json-bignum,內部是直接用字串存,簡單,看了一下覺得還可以,但當然在比較之類的就要小心了,例如相等的話要先 toString() 之後才能比。