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>
参考サイト
関連記事
-
-
表示範囲を自由に変更可能な折れ線グラフが表示できるJSライブラリ amCharts の使用方法
どこかのサイトを閲覧していた際に、恐らくはJavaScriptのライブラリで描写 ...
-
-
JavaScriptで配列やオブジェクトの中身をブラウザに表示する方法
JavaScriptで配列やオブジェクトの中身を確認したい場合、console. ...
-
-
ページ内のスクロールバーを見やすく且つ異なるブラウザ間でも同じデザインにする「SimpleBar」ライブラリの利用方法
CSSのoverflowでスクロールバーを設置した際、ブラウザによってデザイン( ...
-
-
JavaScriptにて「QRCode.js」ライブラリを利用してQRコードを生成する方法
PHPが使えない環境で動的にQRコードを生成したかった。以前にメモしたAPI等の ...
-
-
バニラJS対応(jQuery非依存)の画像遅延読み込みライブラリ「lazysizes」の利用方法
あるサイトのコーディングデータを貰った際に「lazysizes」というJavaS ...