勉強したことのメモ

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

  関連記事

ブラウザ上で画像の切り抜き等編集を行う方法(Cropper.js)

あるサイトで画像をアップロードし、その画像に対してブラウザ上で切り抜き等トリミン ...

jQueryプラグインでクリップボードにコピーする方法(clipboard.js)

ページ上のボタンをクリックすることで特定の文章をクリップボードにコピーしたかった ...

jQuery UIでカレンダーピッカー(Datepicker)の利用方法

フォーム等で日付を入力する際にカレンダーピッカー機能を実装することがある。その際 ...

formで複数選択可能なセレクトメニュー(プルダウン)を実装する方法(select2)

フォームで複数選択可能なセレクトボックス(プルダウン)を実装したい。ただHTML ...

JavaScriptでtableタグをエクセルファイル(xlsx)としてダウンロードさせる方法

table内のデータを何らかのファイルでダウンロードさせたい。通常PHPでCSV ...