勉強したことのメモ

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

  関連記事

PHP Qr Codeライブラリを使用してQRコードを生成する方法
PHP Qr Codeライブラリを使用してQRコードを生成する方法

PHPでQRコードを生成したい。大分前にGoogle Chart APIを用いて ...

PHPでJavaScriptを圧縮するライブラリ「JShrink」の利用方法
PHPでJavaScriptを圧縮するライブラリ「JShrink」の利用方法

サイト内でJavaScriptを用いる場合、外部のライブラリやプラグインだと圧縮 ...

JavaScriptのマップ用ライブラリ「MapLibre GL JS」の利用方法
JavaScriptのマップ用ライブラリ「MapLibre GL JS」の利用方法

あるサイトをWappalyzerで調査していた際に「MapLibre GL JS ...

JavaScriptで簡単にURL操作が行える「domurl」ライブラリの利用方法
JavaScriptで簡単にURL操作が行える「domurl」ライブラリの利用方法

JavaScriptでGETパラメータやURLを操作する際にsplitで配列に分 ...

パスワードの強度を判定できる「zxcvbn」ライブラリの使用方法
パスワードの強度を判定できる「zxcvbn」ライブラリの使用方法

アカウントを作成するようなページで偶にパスワードの強度を判定してメーターで表示さ ...