bignumber.js を使って浮動小数の誤差をなくす

bignumber.js を使って浮動小数の誤差をなくす

JavaScirptでもTypeScriptでもJavaでも浮動小数点数型の計算は誤差がでます。

JavaにはBigDecimalクラスがありますが,jsにもbignumber.jsというライブラリがあるようです。

bignumber.js

インストールします。

npm install --save bignumber.js

足し算はplusメソッド、引き算はminusメソッドを使用します。

掛け算はmultipliedByメソッド、割り算はdividedByメソッドを使用します。

const BigNumber = require('bignumber.js');

let ret;
let x = new BigNumber(0.2);
let y = new BigNumber(0.1);
ret = x.plus(y);
console.log(ret.toNumber());// 0.3
ret = x.minus(y);
console.log(ret.toNumber());// 0.1
ret = x.multipliedBy(y);
console.log(ret.toNumber());// 0.02
ret = x.dividedBy(y);
console.log(ret.toNumber());// 2

誤差が出ないことが確認できます。

ちなみにtoNumberメソッドでnumber型になりますが、toStringメソッドでstring型にはなりませんのでご注意ください。

3桁区切り表記にする

toFormatメソッドを使用すれば簡単にできます。また、toFormat(0)とすることで、小数を整数に変換できます。

const BigNumber = require('bignumber.js');

let ret = new BigNumber(123456789.22);
console.log(ret.toFormat()); // 123,456,789.22と表示される
console.log(ret.toFormat(0)); // 123,456,789と表示される

BigNumberのコンストラクタを出力する

デフォルトの設定がみたい場合はconfig()メソッドを出力すればよいです。

const BigNumber = require('bignumber.js');
console.log(BigNumber.config());

結果は以下のように表示されます。configの設定は変更することも可能です。

{ DECIMAL_PLACES: 20,
ROUNDING_MODE: 4,
EXPONENTIAL_AT: [ -7, 21 ],
RANGE: [ -10000000, 10000000 ],
CRYPTO: false,
MODULO_MODE: 1,
POW_PRECISION: 0,
FORMAT:
{ decimalSeparator: '.',
groupSeparator: ',',
groupSize: 3,
secondaryGroupSize: 0,
fractionGroupSeparator: ' ',
fractionGroupSize: 0 },
ALPHABET: '0123456789abcdefghijklmnopqrstuvwxyz' }

以下は以前に書いた記事です。ご参考ください。

JavaScriptの浮動小数点数型の誤差をなくす

コメント

タイトルとURLをコピーしました