カテゴリ: JavaScript 更新日: 2026/05/22

JavaScriptの小数点計算での注意点と対策まとめ

JavaScriptの小数点計算での注意点と対策まとめ
JavaScriptの小数点計算での注意点と対策まとめ

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptで0.1と0.2を足したら、0.3にならないんですけど…なんでですか?」

先生

「とても良い疑問ですね。実はJavaScriptでは、小数点を扱うときにちょっとしたクセがあるんです。これは『浮動小数点数(ふどうしょうすうてんすう)』という仕組みのせいなんですよ。」

生徒

「浮動小数点数?それって何ですか?」

先生

「簡単に言うと、コンピューターは小数を正確に表現できないことがあるんです。では、具体的な例を見ながら詳しく学んでいきましょう!」

1. JavaScriptで小数点計算がズレる理由

1. 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. なぜ「0.1」や「0.2」を正確に表せないの?
2. なぜ「0.1」や「0.2」を正確に表せないの?

2進数では、10進数の「0.1」は無限に続く小数になってしまいます。たとえば、10進数の「1/3」を書くと「0.3333...」と終わらないのと同じように、2進数で「0.1」を表すと無限に続いてしまうのです。

コンピューターはそれを途中で打ち切って保存するため、ほんの少しだけ誤差が生まれてしまいます。

3. 小数点の誤差を確認してみよう

3. 小数点の誤差を確認してみよう
3. 小数点の誤差を確認してみよう

実際にいくつかの計算を試してみると、どのように誤差が発生するかがよくわかります。


console.log(0.1 + 0.2); // ?
console.log(0.3 === 0.1 + 0.2); // 比較してみよう

0.30000000000000004
false

この結果からわかるように、0.3 === 0.1 + 0.2false(偽)になります。つまり、見た目は同じ0.3でも、内部では違う数値として扱われているのです。

4. 小数点誤差を防ぐ方法①:toFixed()を使う

4. 小数点誤差を防ぐ方法①:toFixed()を使う
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. 小数点誤差を防ぐ方法②:整数に変換して計算する

5. 小数点誤差を防ぐ方法②:整数に変換して計算する
5. 小数点誤差を防ぐ方法②:整数に変換して計算する

もう一つの方法は、小数を一時的に整数に変換して計算する方法です。たとえば、0.1を10倍して1にしてから計算し、最後に10で割るやり方です。


let result = (0.1 * 10 + 0.2 * 10) / 10;
console.log(result);

0.3

この方法なら、計算の途中で誤差が出にくくなります。金額やスコアなど、正確な数値が必要なときによく使われるテクニックです。

6. 小数点誤差を防ぐ方法③:Math.round()を活用する

6. 小数点誤差を防ぐ方法③:Math.round()を活用する
6. 小数点誤差を防ぐ方法③:Math.round()を活用する

Math.round()は四捨五入をする関数です。小数点の計算結果を丸めることで、誤差を目立たなくできます。


let result = Math.round((0.1 + 0.2) * 100) / 100;
console.log(result);

0.3

このように、小数のまま計算するのではなく、途中で整数に変換してから丸めることで、より安定した結果を得られます。

7. 実際の開発での注意点

7. 実際の開発での注意点
7. 実際の開発での注意点

実際のプログラムでは、商品の価格計算や税率計算などで小数点を扱うことが多くあります。そうしたときは、以下のような対策を心がけましょう。

  • 金額割合は整数(例:1円単位や100倍)にしてから計算する
  • 最終的な出力toFixed()Math.round()を使って丸める
  • 厳密な精度が必要な場合は「Big.js」や「Decimal.js」などの外部ライブラリを使う

これらを意識することで、予期せぬ誤差や不具合を防ぐことができます。

8. まとめ:小数点計算は「誤差が出る前提」で考える

8. まとめ:小数点計算は「誤差が出る前提」で考える
8. まとめ:小数点計算は「誤差が出る前提」で考える

JavaScriptの小数点計算は、コンピューターの仕組み上どうしても誤差が出てしまいます。大事なのは、誤差が出ることを理解して、その上で正しい対処をすることです。

この記事で紹介した方法を覚えておけば、数値計算のトラブルを未然に防ぐことができるでしょう。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

JavaScriptで0.1+0.2が0.3にならない原因は何ですか?浮動小数点数やIEEE754について初心者向けに知りたいです

JavaScriptでは数値を64ビット浮動小数点数として管理しているため、0.1や0.2のような10進数の小数を2進数で正確に保存できません。そのため、JavaScriptの小数点計算では誤差が発生し、0.30000000000000004のような結果になります。これはJavaScriptだけではなく、多くのプログラミング言語で共通する仕組みです。
カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのスコープとは?ローカル変数・グローバル変数の違いと使い分け
New2
TypeScript
TypeScriptで型の合成時に発生する型エラーの対処法を徹底解説!初心者にもわかりやすく解説
New3
TypeScript
TypeScriptでAPI呼び出しをラップするユーティリティ関数の設計完全ガイド!初心者向けにAxiosやFetchの使い方を解説
New4
TypeScript
TypeScriptのMapped Typesとインターフェースの連携方法を徹底解説!初心者でも理解できる型変換の基本
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのループで無限ループが起きる原因と対策を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列の長さを取得する(lengthプロパティ)
No.4
Java&Spring記事人気No4
JavaScript
JavaScriptでクエリパラメータを取得する方法を完全解説 URLSearchParamsの使い方を初心者向けに丁寧に説明
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptのファイル分割とimport/exportの基本を徹底解説!初心者でも安心のやさしい入門
No.6
Java&Spring記事人気No6
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptのプリミティブ型と参照型の違いを初心者向けに解説
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】