【Java】小数型「float」と「double」の違いをいっぽずつ解説
はじめに
みなさんどうも、おげんです。
以前の記事では、1や100といった「整数」を扱う型について解説しましたが、今回はその続きです。
私たちが日常でよく使う「1.23」や「0.5」といった小数をJavaでどう扱うかをお話しします。
小数を扱う型は、プログラミングの世界では正式には「浮動小数点数(ふどうしょうすうてんすう)型」と呼ばれます。
なんだか漢字が多くて難しそうな名前ですよね(笑)。
私も最初は「浮動?浮くの?」と戸惑いました。
でも、Javaで用意されているのは主に float と double の2種類だけ。
「2つもあるけど、何が違うの?」「どっちを使えば正解?」
独学時代の私は、この違いをあいまいにしたまま進んでしまい、あとでコンパイルエラーに苦しめられることになりました。
今回は、そんな私の失敗経験も踏まえながら、この2つの違いを丁寧に紐解いていこうと思います。
- Javaの「型」が多すぎて、どれを選べばいいか迷っている人
- floatを使おうとして「エラー」が出て、理由がわからず困っている人
- 「0.1を足しただけなのに計算が合わない!」と不思議に思っている人
- 難しい専門用語なしで、小数の仕組みを「いっぽずつ」理解したい人
floatとdoubleの違い
浮動小数点数型には、大きく分けて float(単精度浮動小数点数) と double(倍精度浮動小数点数) の2種類があります。
「わざわざ2つも用意しなくていいのに…」と当時の私は思っていましたが(笑)、実はこれらには「扱える桁数(精度)」と「データの重さ(サイズ)」に明確な違いがあります。
まずは、以下の比較表を見てみましょう。
| 型名 | サイズ(メモリ) | 扱える有効桁数 | 特徴 |
| float | 32ビット(4バイト) | 約6〜7桁 | 精度は低いが、メモリを節約できる |
| double | 64ビット(8バイト) | 約15桁 | Javaの標準。精度が高く、通常はこちらを使う |
なぜ2つもあるの?
一言で言えば、「精度」と「メモリの節約」のトレードオフです。
昔のコンピューターは今ほど性能が高くなかったので、少しでもメモリを節約するために、それほど精度が必要ないときはサイズの小さい float が重宝されていました。
しかし、現代のPCは非常に高性能です。そのため、Javaの世界では「基本的にはより正確な計算ができる double を使う」というのがルールになっています。
【重要】「f」を忘れるとコンパイルエラー!
Javaを勉強し始めて、浮動小数点数型(float)を使おうとしたとき、多くの人が最初にぶつかる壁があります。それが「謎のコンパイルエラー」です。
例えば、こんなコードを書いたとします。
float height = 170.5; // 実はこれ、エラーになります!一見、何も間違っていないように見えますよね?
「170.5という小数を、小数用の型(float)に入れただけなのになぜ?」と、当時の私はパソコンの前でフリーズしました(笑)。
Javaは「double」が大好き
なぜエラーになるのか。その理由は、「Javaは、小数をそのまま書くと自動的に double 型だと判断する」というルールがあるからです。
Javaの性格を擬人化するなら、こんな感じです。
Java君: 「お、小数(170.5)が出てきたな!これは精度が高い double型 として扱っておくよ!」
ところが、受け皿の方は float です。
「精度の高い(サイズの大きい)double」を、「精度の低い(サイズの小さい)float」に入れようとすると、データが溢れてしまう可能性があるため、Javaは「危ないよ!」とエラーを出して止めてくれるのです。
解決策:お尻に「f」を添える
これを解決するには、「これは float 型なんだよ!」とJavaに教えてあげる必要があります。
float height = 170.5f; // ✅ これでOK!(Fでも可)数字の最後に f(または F) をつける。 たったこれだけのことですが、独学時代の私は「なんでこんな面倒なことを……」と思っていました。
でも、Javaがデータの正確さを守ろうとしてくれている証拠なんだと気づいてからは、少しだけ納得できるようになりました。
どっちを使えばいいの?
floatとdoubleの違いはわかったけれど、結局どちらを使えば正解なのでしょうか?
結論から言うと、「迷ったら double を使う」と覚えておけば間違いありません。
現代のプログラミングにおいて、メモリを数バイト節約することよりも、計算の正確さ(精度)を保つことの方がずっと重要だからです。
特別な理由がない限り、Javaの標準である double を選ぶのがエンジニアの一般的な選択です。
補足:さらに一歩先の話:お金の計算には要注意!
実は、今回紹介した float や double は、非常に細かい計算を繰り返すと、ごくわずかな「誤差」が出ることがあります。
例えば以下のコードを書いたとします。
double sum = 0.1 + 0.1 + 0.1;
System.out.println("0.1を3回足した結果:" + sum);「0.3」になるはずの結果は、こう表示されます。
0.1を3回足した結果:0.30000000000000004「えっ、たった3回の足し算でズレるの!?」と驚きませんか?(笑)
私も初めてこれを見たときは、自分のパソコンが壊れたのかと思いました。
実はコンピュータは内部で「0」と「1」の2進数で数字を扱っています。
実は、人間にとってキリのいい「0.1」という数字は、2進数に直すと「0.00011001100…」と無限に続く小数になってしまうんです。
コンピュータのメモリには限りがあるので、どこかでその数字を打ち切らなくてはいけません。
その「ほんの少しの切り捨て」が計算のたびに積み重なって、こうした目に見える誤差として現れるのです。
そのため、日常のちょっとした計算なら問題ありませんが、銀行のシステムやECサイトの決済など、「1円のズレも許されないお金の計算」には、これらは使えません。
そういった場面では、BigDecimal という、より厳密に小数を扱うための特別なクラスを使います。
「え、また新しいのが出てきた!」と思うかもしれませんが、今は「そういうのもあるんだな」くらいで大丈夫です。まずは基本の double を使いこなせるようになりましょう!
まとめ:型選びも「いっぽずつ」
今回はJavaの浮動小数点数型(小数型)について解説しました。 ポイントを振り返ってみましょう。
- 小数型には
floatとdoubleの2種類がある - Javaの標準(デフォルト)は
double。迷ったらこれを使えばOK! floatを使うときは、お尻にf(またはF)を付けるのを忘れずに- 小数の計算には「誤差」が出ることもあるため、正確さが求められるお金の計算などは要注意
プログラミングの「型」は、最初は種類が多くて難しく感じるかもしれません。
でも、今回のように「なぜエラーが出るのか」「なぜ誤差があるのか」を一つずつ紐解いていけば、必ず自分の知識として定着していきます。
私も4月のエンジニアデビューに向けて、こうした基礎を大切に積み上げていこうと思います。
もしエラーが出ても焦らず、今回の f の付け忘れを思い出してみてくださいね。
一緒に頑張りましょう!




