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(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント