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にはこの他にも数学の計算が行えるような、さまざまなメソッドが準備されています。ドキュメントを参照して利用すると良いでしょう。