Float doubleで誤差が発生する説明¶
はい、float や double で誤差が発生する理由を、初心者にもわかりやすく説明します。
🔍 ざっくり結論¶
コンピュータは 「2進数」しか使えない。
だから、**「きれいな10進数の小数」**が 正確に表現できないことがある。
📌 具体例¶
たとえば「0.1」という値。
人間は当たり前のように「0.1」と書けるけど…
0.1(10進数) = 0.000110011001100...(2進数・無限に続く)
このように、0.1 は 2進数で正確に表現できない無限小数になります。
💥 結果:こんな誤差が出る¶
double a = 0.1;
double b = 0.2;
double c = a + b;
System.out.println(c); // 結果:0.30000000000000004
0.3 に見えるはずが、微妙にずれた 0.30000000000000004 になります。
🧠 なぜ float/double にだけ誤差が出るの?¶
-
floatやdoubleは 有限のビット数で小数を表現します(IEEE 754形式)。 - でも、0.1 や 0.2 などは 2進数で無限に続く → 途中で切り捨てるしかない。
- それが **誤差(丸め誤差)**の原因です。
💡 どうすればいいの?¶
✅ 金額・精度が重要な場面では…¶
→ BigDecimal(Javaの場合)や decimal 型(C#)など、誤差のない小数型を使う。
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
BigDecimal c = a.add(b);
System.out.println(c); // 結果:0.3(誤差なし)
🧪 まとめ¶
| 項目 | 内容 |
|---|---|
| なぜ誤差が出る? | 2進数で小数(例:0.1)が正確に表現できない |
| 影響 | 計算結果が微妙にずれる(例:0.30000004) |
| 対処法 | 金額などは BigDecimal を使う |
| float/doubleの用途 | ざっくりした計算(グラフ、座標など)向け |
さらに図解やアニメーション付きで理解したい場合は、希望を教えてください。それに合わせて説明を調整します!