JavaScriptの小数点計算での注意点と対策まとめ
生徒
「先生、JavaScriptで0.1と0.2を足したら、0.3にならないんですけど…なんでですか?」
先生
「とても良い疑問ですね。実はJavaScriptでは、小数点を扱うときにちょっとしたクセがあるんです。これは『浮動小数点数(ふどうしょうすうてんすう)』という仕組みのせいなんですよ。」
生徒
「浮動小数点数?それって何ですか?」
先生
「簡単に言うと、コンピューターは小数を正確に表現できないことがあるんです。では、具体的な例を見ながら詳しく学んでいきましょう!」
1. JavaScriptで小数点計算がズレる理由
JavaScriptでは、数値はすべて「64ビット浮動小数点数」という形式で扱われます。これは国際的な規格(IEEE754)に基づいたもので、コンピューター内部では2進数(0と1)で小数を表しています。
しかし、2進数では「0.1」や「0.2」のような小数を正確に表せないことがあります。そのため、計算の結果にわずかな誤差が出てしまうのです。
たとえば、次のように書くとどうなるでしょうか。
console.log(0.1 + 0.2);
0.30000000000000004
このように、0.1 + 0.2 が 0.30000000000000004 という中途半端な結果になってしまいます。これはJavaScriptが悪いわけではなく、コンピューター全体の仕組み上の問題なのです。
2. なぜ「0.1」や「0.2」を正確に表せないの?
2進数では、10進数の「0.1」は無限に続く小数になってしまいます。たとえば、10進数の「1/3」を書くと「0.3333...」と終わらないのと同じように、2進数で「0.1」を表すと無限に続いてしまうのです。
コンピューターはそれを途中で打ち切って保存するため、ほんの少しだけ誤差が生まれてしまいます。
3. 小数点の誤差を確認してみよう
実際にいくつかの計算を試してみると、どのように誤差が発生するかがよくわかります。
console.log(0.1 + 0.2); // ?
console.log(0.3 === 0.1 + 0.2); // 比較してみよう
0.30000000000000004
false
この結果からわかるように、0.3 === 0.1 + 0.2 は false(偽)になります。つまり、見た目は同じ0.3でも、内部では違う数値として扱われているのです。
4. 小数点誤差を防ぐ方法①:toFixed()を使う
toFixed()メソッドを使うと、小数点以下の桁数を指定して四捨五入した文字列として出力できます。見た目を整えたいときに便利です。
let result = 0.1 + 0.2;
console.log(result.toFixed(2));
0.30
ただし、注意点としてtoFixed()の結果は「文字列(string)」になるため、そのまま計算には使えません。必要な場合はNumber()関数で数値に戻します。
let num = Number((0.1 + 0.2).toFixed(2));
console.log(num);
0.3
5. 小数点誤差を防ぐ方法②:整数に変換して計算する
もう一つの方法は、小数を一時的に整数に変換して計算する方法です。たとえば、0.1を10倍して1にしてから計算し、最後に10で割るやり方です。
let result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result);
0.3
この方法なら、計算の途中で誤差が出にくくなります。金額やスコアなど、正確な数値が必要なときによく使われるテクニックです。
6. 小数点誤差を防ぐ方法③:Math.round()を活用する
Math.round()は四捨五入をする関数です。小数点の計算結果を丸めることで、誤差を目立たなくできます。
let result = Math.round((0.1 + 0.2) * 100) / 100;
console.log(result);
0.3
このように、小数のまま計算するのではなく、途中で整数に変換してから丸めることで、より安定した結果を得られます。
7. 実際の開発での注意点
実際のプログラムでは、商品の価格計算や税率計算などで小数点を扱うことが多くあります。そうしたときは、以下のような対策を心がけましょう。
- 金額や割合は整数(例:1円単位や100倍)にしてから計算する
- 最終的な出力で
toFixed()やMath.round()を使って丸める - 厳密な精度が必要な場合は「Big.js」や「Decimal.js」などの外部ライブラリを使う
これらを意識することで、予期せぬ誤差や不具合を防ぐことができます。
8. まとめ:小数点計算は「誤差が出る前提」で考える
JavaScriptの小数点計算は、コンピューターの仕組み上どうしても誤差が出てしまいます。大事なのは、誤差が出ることを理解して、その上で正しい対処をすることです。
この記事で紹介した方法を覚えておけば、数値計算のトラブルを未然に防ぐことができるでしょう。