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でリッチなセレクトメニュー(プルダウン)を実装できる「Choices.js」の利用方法
サジェストや複数選択等、機能付きのセレクトメニュー(プルダウン)を実装する際、今 ...
-
JavaScriptでWebカメラやスマホカメラを利用してQRコードを読み取りURLを返す方法
JavaScriptのjsQRというライブラリで簡単にWebページ版QRコードリ ...
-
jQueryのトースト(通知)用ライブラリ「iziToast.js」の利用方法
システム構築の際、エラー表示をJavaScriptのアラートではなくトースト(通 ...
-
JavaScriptでフォームのバリデート時に便利な「validator.js」ライブラリの利用方法
JavaScriptでフォームのバリデートを行う際、「半角英数字 正規表現」等で ...
-
JavaScriptのHTTPクライアントライブラリ「AXIOS」の使い方
あるサイトのソースコードを拝見しているとAXIOSというJSファイルをCDN呼び ...