モチベーション
とあるwebサービスの新機能で、
1. 任意精度の小数も含む計算
2. 浮動小数点誤差の除去
をしたかったので、
a. min.jsがあるかどうか(ファイルサイズが小さくなったもの)
b. 型定義ファイルがあるかどうか
を検討項目に入れ、既存のライブラリを比較しました。
前提
JSのプリミティブNumber型は、倍精度浮動小数点数なので、特有の誤差を生じます。
もし任意精度での計算をしたいとなると、その実装はとてもめんどくさいです。
実は、BigIntという新たな数値型が任意精度計算をサポートしますが、
まだプロポーザルの状態です。
- TC39でプロポーザルに挙がっている新しい数値型
- 現在はStage3
- 採用確定ではない(Stage4になるまでは却下される可能性あり)
- 任意精度の整数
- ハードウェアがサポートしているのではなく、各処理系がソフトウェア的に実装する
JavaScriptの任意精度整数: BigInt vs big-integer - Qiita
JavaScriptのBigIntで任意精度の整数値を扱う
また、BigIntは整数だけなので、小数点をサポートしません。
数値計算ライブラリ比較表
ライブラリ | 機能 | 最終更新 | minサイズ | 型定義 | 備考 | GitHub |
---|---|---|---|---|---|---|
bigNumber.js | 任意精度 | 2018年 | 8 kB | あり | APIが読みやすい | MikeMcl/bignumber.js |
numeral.js | メインは表示制御 | 2017年 | 11 kB | あり | 公式ページがイケてる | adamwdraper/Numeral-js |
BigInteger | 任意精度整数 | 2018年 | 27 kB | あり | 活発に開発されている | peterolson/BigInteger.js |
math.js | 高機能 (複素・行列など) |
2018年 | 135 kB | あり | 内部でBigNumber.jsを使っているらしい | josdejong/mathjs |
BigInt | 任意精度整数 | - | - | - | Chromeのみ対応 (2018/8現在) |
- |
decimal.js | 最低限の計算機能のみ | 2011年 | なし | なし | shinuza/decimal-js | |
jsdecimal | 4倍精度(28桁まで) | 2015年 | なし | なし | 日本人の誰かが書いたやつ | hiroshi-manabe/JSDecimal |
bigDecimal.js | 情報が少ない | 2012年 | なし | なし | 古い | iriscouch/bigdecimal.js |
結局どれ?
僕は、任意精度・小数が使える中で、もっともminの小さいBigNumber.jsを選びました。
今後BigIntが正式採用されれば、BigNumberも採用される流れになるかもしれませんが、
当面はブラウザのサポートをあてにはできないでしょう。
IEやEdgeを捨てられないサービスでは特にね、、、、