勉強したことのメモ

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でオブジェクトをzlib圧縮してCookieに保存できる「zcookies」ライブラリの利用方法

あるシステムでCookieを保存している部分があった。ただ、日本語を保存している ...

Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法

プッシュ通知(デスクトップ通知)を実装してみたい。また、通知の際は分かりやすいよ ...

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

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

JavaScriptのHTTPクライアントライブラリ「AXIOS」の使い方

あるサイトのソースコードを拝見しているとAXIOSというJSファイルをCDN呼び ...

JavaScriptにて領収書等のテンプレートHTMLページをPDFファイル化させる方法(html2pdf)

JavaScriptにてhtml2pdfというライブラリを使用することでHTML ...