bignumber.js を使って浮動小数の誤差をなくす
JavaScirptでもTypeScriptでもJavaでも浮動小数点数型の計算は誤差がでます。
JavaにはBigDecimalクラスがありますが,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' }
以下は以前に書いた記事です。ご参考ください。

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^


コメント