勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

JavaScriptで小数の計算をする際にずれ(誤差)を無くす方法(decimal.js)

   2024/03/13  JavaScript

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>

 

参考サイト

http://laxmi759.blog.fc2.com/blog-entry-92.html

 - JavaScript

  関連記事

JavaScriptのライブラリ「crypto-js」を使用して暗号化・復号化・ハッシュ化する方法

JavaScriptにてCookie等にデータを保存する際に暗号化したものを保存 ...

JavaScriptのリッチなalert / confirmぽいウィンドウを表示する「sweetalert2」の利用方法

JavaScriptのalert / confirmはブラウザによって表示位置や ...

画像にマウスを合わせると拡大表示させる「drift」ライブラリの利用方法

amazon等ECサイトで商品画像にマウスを合わせると当該部分が拡大表示されると ...

ローソク足のグラフをJavaScriptで描写する方法(highstock)

株価か仮想通貨などの値動き(チャート)を図表とするローソク足のグラフを何らかの方 ...

JavaScriptの日時・時刻用ライブラリ「Day.js」の利用方法について

JavaScriptの日時・時刻用を取り扱う際、PHPと比べると(個人的には)使 ...