posted: 2019/03/27

JavaScriptのBigIntを使うときに丸められないようにする

JavaScriptはこれまで数値として9007199254740991(Number.MAX_SAFE_INTEGER)以下の値しか扱えなかった。
これがBigIntがpropsalされることでvanillaに巨大な数を扱えるようになった。
Numberが勝手に指数表記になってしまう問題も解決出来るのでとても重宝する。
// 下記どちらかでBigIntを宣言出来る
100n
BigInt(100)
しかし、ここでちょっとした落とし穴がある。
例えば下記のような事をすると
console.log(BigInt(100000000000000000000000))
なんと結果はこうなる。
> 99999999999999991611392n
はてこれはどういうことか?
これはBigIntへの渡し方に問題がある。上記は実は下記のように解釈されていることになる
BigInt(Number(100000000000000000000000))
こうなると、一度Numberとして値が丸められ、丸められた値がBigIntに渡る。

どうするか?

渡し方に問題があるので、そこを改善してやればいい。例えば文字列で渡すと解決する
console.log(BigInt("100000000000000000000000"))
> 100000000000000000000000n
めでたしめでたし。
Edit on Github