JavaScriptで小数の計算の誤差を解決する『decimal.js』

JavaScriptに限らず、コンピュータは小数の計算が苦手です。例えば、次のプログラムを実行してみましょう。

console.log(100 * 1.1);

100 × 1.1という計算なので、結果は「110」になるはずです。しかし、JavaScriptで実行すると次のように「110.000…1」などとおかしな数字になってしまいます。

これは、コンピュータが数字を2進数で扱っている関係で小数を扱うのが難しく、計算結果に誤差が生まれてしまうというもの。コンピュータで計算をする限りは、逃げることができない現象です。そこで、正しく計算を行えるライブラリを利用すると良いでしょう。

ここでは『deciaml.js』の使い方を紹介しましょう。

decimal.jsをインストールしよう

decimal.jsは、次のGitHubで公開されているので、右上の「Code」ボタンをクリックして「Download ZIP」をクリックしてダウンロードします。

ソースファイルなどと合わせて「decimal.js」というファイルが見つかるので、これを自分のプログラムから参照できる場所にコピーしましょう。次のようにしてライブラリを組み込みます。

<script src="decimal.js"></script>

Decimalオブジェクトを使おう

ライブラリを組み込むと、「Decimal」というオブジェクトが利用できるようになります。次のようにして、新しいインスタンスを準備しましょう。

const tax = new Decimal('1.1');

ここで、カッコ内の「コンストラクタ」に「1.1」という数字を指定しているのですが、両端にシングルクオートがあることに注目しましょう。これは、「文字列」として、1.1という値を渡しています。というのは、ここで数字で渡してしまうと、この時点で誤差が出てしまう恐れがあるため、文字列として扱うことで誤差が生まれないようにしているのです。

同じように計算する相手も作りましょう。

const tax = new Decimal('1.1');
let price = new Decimal('100');

これで準備完了です。

かけ算をしよう

Decimalオブジェクトの場合、計算も普通に計算記号(算術演算子)を使って行うことはできず、すべてメソッドを通じて行います。かけ算をするには「times」メソッドを使いましょう。次のようにします。

let tax_in = price.times(tax).toNumber();

計算結果は「toNumber」メソッドで数字に変換します。これで、計算結果を通常の数字として扱うことができるようになりました。後は、画面に表示すれば完成です。全体のプログラムを確認しましょう。

<script src="decimal.js"></script>
<script>
    const tax = new Decimal('1.1');
    let price = new Decimal('100');

    //計算したい値をパラメータとして渡し、「times」で掛け算、「toNumber()」で計算結果を数字に変換
    let tax_in = price.times(tax).toNumber();
    console.log(tax_in);
</script>

これで、画面には正しく「110」と表示されます。小数を扱うときには、誤差に注意して計算しましょう。なお、decimal.jsにはこの他にも数学の計算が行えるような、さまざまなメソッドが準備されています。ドキュメントを参照して利用すると良いでしょう。