thumbnail

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と同様の文字列変換が使えます。 また、いい感じに,を挿入してくれるtoFormatmethodも使用可能です。

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が内部的に使われているようです。

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

Profile

author picture

Mitsuru Takahashi

京都市内にてフリーランスエンジニアとして活動しています。

detail

© 2022 mitsuru takahashi