JavaScriptで小数の計算をする際にずれ(誤差)を無くす方法(decimal.js)
2024/03/13
JavaScriptで小数の計算をすると値がずれる(誤差が発生する)ことがあった。調べてみるとJavaScriptはIEEE754とかいう規格にそって実装されており、そのせいで誤差が生まれるらしい。自作関数とかで何とかする方法とライブラリで対応する方法があり、ライブラリの方が楽そうだったので使用方法のメモ。
ライブラリの用意
自サーバにアップロードする場合
以下からdecimal.jsをダウンロードし、適当なディレクトリにアップロードする。
https://github.com/MikeMcl/decimal.js/
CDNで利用する場合
以下を記述する。
<script src="https://cdnjs.cloudflare.com/ajax/libs/decimal.js/9.0.0/decimal.min.js"></script>
バージョンを変更したい場合は以下から探す。
https://cdnjs.com/libraries/decimal.js/9.0.0
リファレンス
https://mikemcl.github.io/decimal.js/
使い方
let dec = new Decimal(0.001); //足し算 dec = dec.plus(0.001); //引き算 dec = dec.minus(0.001); //掛け算 dec = dec.times(0.001); //割り算 dec = dec.div(0.001); //数値化 const num = dec.toNumber(); //メソッドチェーンみたいにも使える console.log(dec.times(0.01).toNumber());
toNumber()で数値化しないとオブジェクトが返ってくるので注意する。
ソース
基本的な使い方
<script> const a = 0.01; const b = 0.0001; console.log(a * b); //0.0000010000000000000002が表示される const dec = new Decimal(a); console.log(dec.times(b).toNumber()); //0.000001が表示される </script>
消費税の計算サンプル
<script> const tax = 1.1; const price = 1650; const total_price = tax * price; console.log(total_price); //1815.0000000000002が表示される const tax = new Decimal(1.1); const price = 1650; const total_price = tax.times(price).toNumber(); console.log(total_price); //1815が表示される </script>
参考サイト
関連記事
-
-
jQuery UIでカレンダーピッカー(Datepicker)の利用方法
フォーム等で日付を入力する際にカレンダーピッカー機能を実装することがある。その際 ...
-
-
JavaScript / PHPにて「lz-string」を用いてデータの圧縮・展開する方法
文字数が多いGETパラメータを送信したいというケースがあった。また、送信側はJa ...
-
-
表示範囲を自由に変更可能な折れ線グラフが表示できるJSライブラリ amCharts の使用方法
どこかのサイトを閲覧していた際に、恐らくはJavaScriptのライブラリで描写 ...
-
-
JavaScriptにて時間や長さの単位を変換及び計算できる「mathjs」ライブラリの利用方法
JavaScriptにて時間の単位を「分->時」に、長さの単位を「mm-& ...
-
-
ローソク足のグラフをJavaScriptで描写する方法(highstock)
株価か仮想通貨などの値動き(チャート)を図表とするローソク足のグラフを何らかの方 ...