JavaScriptでの浮動小数点数の誤差と対策方法

JavaScriptで計算を行う際、特に浮動小数点数の計算で誤差が発生することがあります。

例えば、0.3 * 3 と計算すると期待通りの結果が得られないことがあります。

今回は、その理由と誤差を回避するための対策方法について解説します。

浮動小数点数の誤差の理由

JavaScriptはIEEE 754標準の倍精度浮動小数点数(2進数)を使用して数値を表現しています。

この標準は数値を有限のビット数で表現するため、すべての小数を正確に表現できるわけではありません。

特に0.3 のような小数は内部的に2進数で無限に続き正確に表現できないため、計算結果に微小な誤差が生じることがあります。

実際のコードの例としては以下となります。

console.log(0.3 * 3)  // 0.8999999999999999

対策方法

整数で計算する

計算を整数で行い、最後に小数に戻す方法です。

小数点で誤差が発生してしまうのであれば整数で計算してあげればよいです。

let result = Math.round(0.3 * 10) * 3 / 10
console.log(result) // 0.9

ライブラリを使用する

浮動小数点数の誤差を避けるために、ライブラリを使用することも有効です。

例えば代表的なものでいればdecimal.jsを使うのも良いかと思います。

インストール:

$ npm install decimal.js

例:

import Decimal from 'decimal.js';

// 0.3 を表す Decimal オブジェクトを作成し、3 倍する
const result = new Decimal(0.3).times(3);

console.log(result.toString()); // "0.9" を表示

まとめ

これらの方法によりJavaScriptの数値計算の精度を高めることができます。

プロジェクトに合わせて適切な方法で正確な計算結果を得ましょう。