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>
参考サイト
関連記事
-
Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法
プッシュ通知(デスクトップ通知)を実装してみたい。また、通知の際は分かりやすいよ ...
-
JavaScriptのリッチなalert / confirmぽいウィンドウを表示する「sweetalert2」の利用方法
JavaScriptのalert / confirmはブラウザによって表示位置や ...
-
横スクロール可能な要素を視覚的に分かりやすくする「ScrollHint」ライブラリの利用方法
横長のtableを設置し、CSSのoverflowで横スクロール可能にしてもユー ...
-
JavaScriptでtableタグをエクセルファイル(xlsx)としてダウンロードさせる方法
table内のデータを何らかのファイルでダウンロードさせたい。通常PHPでCSV ...
-
ページ内のスクロールバーを見やすく且つ異なるブラウザ間でも同じデザインにする「SimpleBar」ライブラリの利用方法
CSSのoverflowでスクロールバーを設置した際、ブラウザによってデザイン( ...