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>
参考サイト
関連記事
-
-
JavaScriptにてカラーコードのピッカーを実装できる「jscolor」の利用方法
フォームのテキストボックスにカラーコードのピッカーを実装したかった。HTMLのみ ...
-
-
横スクロール可能な要素を視覚的に分かりやすくする「ScrollHint」ライブラリの利用方法
横長のtableを設置し、CSSのoverflowで横スクロール可能にしてもユー ...
-
-
JavaScriptでダミー画像(プレースホルダー画像)を表示する「Holder.js」ライブラリの利用方法
サイトの開発段階で「本番用の画像はまだ用意できていない」等の理由によりダミー画像 ...
-
-
ローソク足のグラフをJavaScriptで描写する方法(highstock)
株価か仮想通貨などの値動き(チャート)を図表とするローソク足のグラフを何らかの方 ...
-
-
jQueryのトースト(通知)用ライブラリ「iziToast.js」の利用方法
システム構築の際、エラー表示をJavaScriptのアラートではなくトースト(通 ...