前回は整数を扱う型を紹介しました。今回は小数点付きの数(実数)を扱う型を紹介します。
「float」と「double」という型で、小数点付きの数を扱うことができます。この2つの型の違いは、使用するメモリ サイズです。floatは32bit、doubleは64bitになります。
また、floatの値は「1.23f」のように、数字の末尾に「f」をつけます。doubleは「1.0」のように、通常の小数点の書き方で書きます(もしくは「1.0d」と書きます)。
float f = 1.23f; double d = 1.0;
型 | サイズ | 扱う数字 |
---|---|---|
float | 32bit | ±3.4028235E38~±1.4E-45 |
double | 64bit | ±1.7976931348623157E308~±4.9E-324 |
先ほどの表に出てきた「E」は「10の何乗か」を表しています。「E38」は「10の38乗」、「E-45」は「10の-45乗」を表しています。また、「E2」なら「100」、「E-2」なら「0.01」になります。
これらは、大きな桁の数字、小さな桁の数字を扱うための書き方です。
1.23E3 → 1.23×10の3乗 → 1.23×1000 → 1230 1.23E-2 → 1.23×10の-2乗 → 1.23×0.01 → 0.0123
Javaのプログラミングでは、floatやdoubleを利用することで小数点付きの数(実数)を扱えます。しかし、プログラムでは、0と1で値を表すので、少数は表現できません。
そこでプログラムでは、小数を特殊な方法で近似して表現しています。こういった数を「浮動小数点数」と呼びます。
この浮動小数点数には「誤差」が含まれます。なぜならば、浮動小数点数は、実数そのものではなく、その近似でしかないからです。
そのため、たとえば「1.1+2.2」という計算をした場合には、「3.3」とはならずに「3.3000003」のような誤差が紛れ込みます。
こういった事情があるために、浮動小数点数では「どちらが大きいか」という比較はできますが「2つの値が同じか」という確認はできません。計算の過程で誤差が紛れ込むために、きっちり同じ数字にはならないからです。
浮動小数点数を使う際は、この誤差のことを思い出して下さい。
System.out.println(1.1 + 2.2); // 「3.3000000000000003」と出力