勉強したことのメモ

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

  関連記事

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でスクロールバーを設置した際、ブラウザによってデザイン( ...