
Javaのdouble型とは?float型とdouble型の形式・値の範囲や型変換
- SE
- Javaのdoubleとはどのような型でしょうか。
- PM
- 基本の数値型の中で最も広い範囲の数を表せるのがdouble型です。
目次
Javaの数値型の種類
Javaの基本型のうち、数値を表す型には、整数を扱うbyte、short、int、longと、実数を扱うfloat、doubleがあります。
それぞれの型は、何バイトで保持するかというサイズが決まっていて、サイズによって表現可能な値の範囲が決まります。各型のサイズと値の範囲を次の表にまとめました。
型 | 値の種類 | バイト数 | 値の範囲 |
---|---|---|---|
byte | 整数 | 1 | -128~127 |
short | 整数 | 2 | -32768~32767 |
int | 整数 | 4 | -2147483648~2147483647 |
long | 整数 | 8 | -9223372036854775808~9223372036854775807 |
float | 実数 | 4 | 約±3.4×(10の38乗)~約±1.4×(10の-45乗) |
double | 実数 | 8 | 約±1.8×(10の308乗)~約±4.9×(10の-324乗) |
Javaのdouble型とは?
基本の数値型の中で最も広い範囲の数を表せるのがdouble型です。double型は8バイトの浮動小数点形式で表現されます。以下では、Javaのdouble型について詳しく説明していきます。
浮動小数点型とは?
浮動小数点型は、数値を仮数部と指数部に分けた表現形式です。
例えば、1234の値を持つ大きさの異なる数値は、次のように表せます。
1 2 3 |
1234000000 = 1.234×(10の9乗) 12.34 = 1.234×10 0.001234 = 1.234×(10の-3乗) |
ここで、1.234の部分が仮数部、指数部は10のべき数を表し、それぞれ9、1、-3となります。このような形式により、限られたビット数で、0に近い値から大きな値まで、広い範囲を表現できます。
float型とdouble型の形式
Javaのfloat型とdouble型は、IEEE754という国際規格の形式を用いています。floatは単精度、doubleは倍精度浮動小数点と呼ばれます。
32ビット(4バイト)のfloat型では、符号が1ビット、指数が8ビット、仮数が23ビットです。64ビット(8バイト)のdouble型は、符号が1ビット、指数が11ビット、仮数が52ビットです。
double型の最大値と最小値を表す定数
Javaでdouble型の範囲を表す定数は、DoubleクラスのMAX_VALUEとMIN_VALUEです。
これらを表示するJavaプログラムの例を示します。
1 2 3 4 5 6 7 8 |
public class MaxMinDouble { public static void main(String[] args) { System.out.println(""Double.MAX_VALUE: "" + Double.MAX_VALUE); System.out.println(""Double.MIN_VALUE: "" + Double.MIN_VALUE); } } |
実行結果は次のようになります。
1 2 3 4 |
Double.MAX_VALUE: 1.7976931348623157E308 Double.MIN_VALUE: 4.9E-324 |
ここでMIN_VALUEは負の最小値ではなく、最も0に近い正の数を表しています。負の値の範囲は、-MAX_VALUE~-MIN_VALUEとなります。
小数の表示形式を指定する方法
double型変数の値を出力するとき、桁数を指定するためにStringクラスのformatメソッドを利用できます。書式%fは、double型の値を10進数として表示します。小数点以下はデフォルトで6桁です。%.4fのようにピリオドの後に桁数を指定できます。
書式%eは、double型の値を指数表示で示します。この場合も、%.4eのように小数点以下の桁数を指定できます。
formatメソッドを使ったJavaコード例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class PrintDouble { public static void main(String[] args) { double dvar = 200.0 / 3; System.out.println(""dvar = "" + dvar); System.out.println(String.format(""dvar[f] = %f"", dvar)); System.out.println(String.format(""dvar[.4f] = %.4f"", dvar)); System.out.println(String.format(""dvar[e] = %e"", dvar)); System.out.println(String.format(""dvar[.3e] = %.3e"", dvar)); } } |
実行結果は次のようになりました。最終桁は、四捨五入された値となります。
1 2 3 4 5 6 7 |
dvar = 66.66666666666667 dvar[f] = 66.666667 dvar[.4f] = 66.6667 dvar[e] = 6.666667e+01 dvar[.3e] = 6.667e+01 |
doubleとintの型変換
Javaの異なる数値型間の型変換では、変換後の型が変換前の型より大きい場合には、暗黙的な型変換が行われます。基本数値型の中でdouble型は最も広範囲の値を扱えるため、他の型からdoubleへの変換では暗黙的な型変換が行われます。
int型とdouble型の代入
int型の値をdouble型に代入する場合、暗黙的な型変換が行われるので、型変換を記述する必要はありません。double型の値をint型に代入する場合には、明示的なキャスト必要です。
次のJavaコード例を用いて説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class DoubleInt01 { public static void main(String[] args) { double d; int a; d = 10.6; //a = d; ---> Compile Error! a = (int)d; System.out.println(""a = "" + a); d = a; System.out.println(""d = "" + d); } } |
実行結果は次のようになります。
1 2 3 4 |
a = 10 d = 10.0 |
double型をint型に代入するために、”(int)d” のように、型変換を指定しています。これを書かない場合には、コンパイルエラーが発生します。小数点以下の値は、変換時に切り捨てられます。int型変数aをdouble型変数dへ代入する際には、型変換の記述は不要です。
演算オペランドの型変換
整数オペランドの演算結果を小数で得たい場合があります。主な例は、整数同士の割り算を行う場合です。
次のJavaコード例を用いて説明します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class DoubleInt02 { public static void main(String[] args) { int a = 200; double d; d = a / 3; System.out.println(""[1] d = "" + d); d = a / 3.0; System.out.println(""[2] d = "" + d); d = (double)a / 3; System.out.println(""[3] d = "" + d); } } |
実行結果は次のようになります。
1 2 3 4 5 |
[1] d = 66.0 [2] d = 66.66666666666667 [3] d = 66.66666666666667 |
[1]では、int同士の除算が実行されて、66という結果が得られます。これを代入によりdouble型に変換するので、結果は66.0になります。[2]と[3]は、一方のオペランドがdouble型のため、doubleの除算が行われ、結果を小数値で得られます。
- SE
- float型とdouble型の形式や値の範囲や型変換の方法がよく理解できました。
- PM
- doubleは基本の数値型の中で最も広い範囲の値を扱う型なので、使い方を覚えておきましょう。
Javaのdouble型を使いこなそう
Javaの浮動小数点型doubleについて、値の範囲や表示形式、intとの型変換について説明しました。doubleは基本の数値型の中で、最も広い範囲の値を扱う型です。
数値計算を行うプログラムで、整数型の範囲におさまらない大きな数を扱う場合や、小数値を扱う場合に、double型が役立ちます。値の範囲や桁数を意識しながら、数値計算を試してみて下さい。