bignumber.js使用方法
2022/03/12
javascriptでは小数点の計算は丸め誤差のために正確ではないです。
const a = 0.1 + 0.2
// 0.30000000000000004
javascriptでも正確な計算を行いたい場合はbignumber.jsなどのサードパーティライブラリを使用します。 使い方は非常に簡単なので、会計などの正確な計算を必要とする場合はbignumber.jsをオススメします。
bignumber.jsとは?
任意精度の算術演算を行うためのjavascriptライブラリです。 ドキュメント
インストール方法
npmパッケージとしてインストール可能です。
$ npm install bignumber.js
or
$ yarn add bignumber.js
使用方法
コンストラクター
import BigNumber from 'bignumber.js';
// or maybe
import { BigNumber } from 'bignumber.js';
let x = new BigNumber(123.4567);
let y = BigNumber('123456.7e-3');
let z = new BigNumber(x);
x.isEqualTo(y) && y.isEqualTo(z) && x.isEqualTo(z); // true
四則演算
let result;
let x = new BigNumber(0.2);
let y = new BigNumber(0.1);
result = x.plus(y);
console.log(result.toNumber()); // 0.3
result = x.minus(y);
console.log(result.toNumber()); // 0.1
result = x.multipliedBy(y);
console.log(result.toNumber()); // 0.02
result = x.dividedBy(y);
console.log(result.toNumber()); // 2
比較演算
BigNumber(0.2).eq(0.2); // ===
BigNumber(0.2).gt(0.1); // >
BigNumber(0.2).gte(0.1); // >=
BigNumber(0.1).lt(0.2); // <
BigNumber(0.1).lte(0.2); // <=
その他の演算
/* decimalPlaces */
x = new BigNumber(1234.56)
x.decimalPlaces(1) // '1234.6'
x.dp() // 2
x.decimalPlaces(2) // '1234.56'
x.dp(10) // '1234.56'
x.decimalPlaces(0, 1) // '1234'
x.dp(0, 6) // '1235'
x.decimalPlaces(1, 1) // '1234.5'
/* squareRoot */
x = new BigNumber(16)
x.squareRoot() // '4'
y = new BigNumber(3)
y.sqrt() // '1.73205080756887729353'
/* exponentiatedBy */
Math.pow(0.7, 2) // 0.48999999999999994
x = new BigNumber(0.7)
x.exponentiatedBy(2) // '0.49'
BigNumber(3).pow(-2) // '0.11111111111111111111'
/* devidedToIntegerBy */
x = new BigNumber(5)
y = new BigNumber(3)
x.dividedToIntegerBy(y) // '1'
x.idiv(0.7) // '7'
x.idiv('0.f', 16) // '5'
/* modulo */
x = new BigNumber(1)
x.modulo(0.9) // '0.1'
/* toFraction */
a = new BigNumber(1.75)
a.toFraction() // '7, 4'
pi = new BigNumber('3.14159265358')
pi.toFraction() // '157079632679,50000000000'
pi.toFraction(100000) // '312689, 99532'
pi.toFraction(10000) // '355, 113'
pi.toFraction(100) // '311, 99'
pi.toFraction(10) // '22, 7'
pi.toFraction(1) // '3, 1'
文字列変換
javascriptのNumberと同様の文字列変換が使えます。
また、いい感じに,
を挿入してくれるtoFormat
methodも使用可能です。
x = new BigNumber(255.5)
x.toExponential(5) // "2.55500e+2"
x.toFixed(5) // "255.50000"
x.toPrecision(5) // "255.50"
x.toNumber() // 255.5
y = new BigNumber('1234567.898765')
y.toFormat(2) // "1,234,567.90"
おわり
bignumber.js以外にもdecimal.js, bn.jsなど似たようなライブラリは他にもあります。 web3開発に使用するweb3.jsではbn.jsが内部的に使われているようです。