double型とは
この記事では、Javaのdouble型について特徴や使い方を紹介します!
double型は、Javaで小数を扱えるデータ型の1つです。
プリミティブ型で、64ビットのサイズを扱えます。
倍精度浮動小数点数とも呼ばれます。
- 変数に小数値を代入
- 文字列の小数を計算に使用
- 割り算の計算結果を扱う
上記のようなシチュエーションで、double型で小数を扱うことが多いです。
その他のデータ型と比較してみると、次のようになります。
データ型 | 種類 | ビット数 | 範囲 |
---|---|---|---|
byte | 数値 | 1バイト(8ビット) | -128〜127(約128) |
short | 数値 | 2バイト(16ビット) | -32,768〜32,767(約3.2万) |
int | 数値 | 4バイト(32ビット) | -2,147,483,648〜2,147,483,647(約21億) |
long | 数値 | 8バイト(64ビット) | -9,223,372,036,854,775,808〜9,223,372,036,854,775,807(約900京) |
float | 浮動小数点 | 4バイト(32ビット) | ±3.40282347E+38~ 1.40239846E-45 |
double | 浮動小数点 | 8バイト(64ビット) | ±1.79769313486231570E+308~±4.94065645841246544E-324 |
boolean | 真偽値 | 1ビット | true or false |
浮動小数点には、float型もありますが、その違いは扱える範囲です。
double型の方が、倍の範囲で小数値を扱えます。
doubleとDoubleの違いは?
「double と Double を見るけど、なにが違うんだろう?」と思う人もいるのではないでしょうか。
doubleは、前述したようにプリミティブ型のデータ型です。
一方、Doubleはクラスを指します。
Doubleクラスになるので、使用する際はオブジェクトを生成する必要があります。
また、Doubleを使う例として、以下のような場合が挙げられるでしょう。
- Doubleが持つメソッドを使う場合
- 値がない(null)場合
このように、doubleとDoubleがあるのは、使い方を分けたい場合に活用するためです。
double型の使い方
では、double型を実際に使ってみましょう。
以下のプログラムは、身長と体重を表示するのと、BMI値を計算しています。
■記述例 import java.math.BigDecimal; import java.math.RoundingMode; public class Main { public static void main(String[] args){ double height = 172.7; double weight = 70.4; System.out.println("身長は " + height + " cmです"); System.out.println("体重は " + weight + " kgです"); double result = weight / (height * height) * 10000; BigDecimal bmi = new BigDecimal(result); bmi = bmi.setScale(1, RoundingMode.HALF_UP); System.out.println("BMIは " + bmi + " です"); } }
実行結果は次の通りです。
■実行結果 mbp:Desktop potepan$ java Main 身長は 172.7 cmです 体重は 70.4 kgです BMIは 23.6 です
BMI値の計算部分を少し補足します。
「BigDecimal」を使うことで、小数点以下の正確な値の計算を行えるようにします。
BigDecimalについては、以下の記事で詳しく解説しているので、ぜひ参考にしてみてください!
【関連記事】
▶︎【Java】正確に計算するためにBigDecimalの使い方を覚えよう!
また、setScaleメソッドを使うことで、小数点第1位で値を丸める処理も加えています。
これらの処理によって、BMI値が計算された上で、小数点第1位で丸められた結果を取得しています。
double型の変換まとめ
ここまで、double型の特徴や使い方を紹介しました。
この章では、double型を他のデータ型に変換する方法について見ていきましょう。
double型⇄int型の変換
double型とint型を変換するには、キャストを行いましょう。
記述方法は次の通りです。
■記述例 public class Main { public static void main(String[] args){ double d1 = 13.5; int i1 = 10; int i2 = (int)d1; double d2 = (double)i1; System.out.println("d1 = " + d1); System.out.println("d2 = " + d2); System.out.println("i1 = " + i1); System.out.println("i2 = " + i2); } } ■実行結果 mbp:Desktop potepan$ java Main d1 = 13.5 d2 = 10.0 i1 = 10 i2 = 13
int型の値はdouble型に、double型の値はint型に変換できているのがわかります。
double型をint型に変換する際に切り上げるには?
double型の値をint型に変換した際に、値を切り上げたい場合があると思います。
値の切り上げを行うには、ceilメソッドを使いましょう。
ceilメソッドを使うことで、小数第1位を切り上げて値を取得できます。
参考に記述例を載せると、次のようになります。
■記述例 public class Main { public static void main(String[] args){ double d1 = 13.5; int i1 = (int)(d1); int i2 = (int)Math.ceil(d1); System.out.println("切り上げなしの結果:" + i1); System.out.println("切り上げありの結果:" + i2); } } ■実行結果 mbp:Desktop potepan$ java Main 切り上げなしの結果:13 切り上げありの結果:14
double型をint型に変換した上で、値の切り上げができていますね。
double型⇄String型の変換
「数値と文字列を変換できるの?」と思うかもしれませんが、変換可能です!
ここでは、double型とString型の変換を行ってみましょう。
まず、double型をString型に変換するには、「valuOfメソッド」を使います。
valueOfメソッドは、数値型を文字列型に変換できるメソッドです。
例えば、次のように記述して変換できます。
■記述例 public class Main { public static void main(String[] args){ double d = 123.45; String s = String.valueOf(d); System.out.println("String型の値 : " + s); } }
valueOfメソッドの引数に、変換したい変数(double型)を記述すればOKです。
実行結果は、次のようになります。
■実行結果 mbp:Desktop potepan$ java Main String型の値 : 123.45
一方、String型をdouble型に変換するには、「parseDoubleメソッド」を使いましょう。
使うことで、文字列をdouble型の値に変換可能です。
次のように記述できます。
■記述例 public class Main { public static void main(String[] args){ String s = "123.45"; double d = Double.parseDouble(s); System.out.println("double型の値 : " + d); } } ■実行結果 mbp:Desktop potepan$ java Main double型の値 : 123.45
このように、期待した結果を取得できました!
double型のnullチェック
double型でnullチェックをしたいと思っているかもしれません。
しかし、double型はそもそもnullにはできないのです。
冒頭で説明したように、doubleはプリミティブ型のデータ型です。
そして、プリミティブ型はnullにできません。
そのため、double型の変数はそもそもnullにならないというわけです。
それでも、nullチェックを行う場合は、「isNaNメソッド」を使いましょう。
「NaN」は、非数値を表します。
nullではありませんが、nullチェックのような扱いでチェック可能です。
次のように記述できます。
■記述例 public class Main { public static void main(String[] args){ double d = Double.NaN; if(Double.isNaN(d)) { System.out.println("d は NaN です!"); } else { System.out.println("d は NaN ではありません!"); } } } ■実行結果 mbp:Desktop suzuka$ java Main d は NaN です!
使う機会は少ないと思いますが、覚えておくと便利でしょう。
double型の四捨五入
「double型をint型に変換する際に切り上げるには?」で、値を切り上げる方法について解説しました。
切り上げと合わせて、ここでは四捨五入や切り捨ての方法も見ていきましょう。
それぞれの処理で使うメソッドは、次の通りです。
- 切り上げ:ceilメソッド
- 切り捨て:floorメソッド
- 四捨五入:roundメソッド
使い方は、ceilメソッドと同様です。
実際にプログラムを動かして確認してみましょう。
■記述例 public class Main { public static void main(String[] args){ double d = 123.6; System.out.println("double型の切り上げ : " + Math.ceil(d)); System.out.println("double型の切り捨て : " + Math.floor(d)); System.out.println("double型の四捨五入 : " + Math.round(d)); } } ■実行結果 mbp:Desktop potepan$ java Main double型の切り上げ : 124.0 double型の切り捨て : 123.0 double型の四捨五入 : 124
それぞれ、意図した動作になっています。
ただし、マイナスの値を四捨五入すると次のような結果になります。
■記述例 public class Main { public static void main(String[] args){ double d = -123.6; System.out.println("double型の切り上げ : " + Math.ceil(d)); System.out.println("double型の切り捨て : " + Math.floor(d)); System.out.println("double型の四捨五入 : " + Math.round(d)); } } ■実行結果 mbp:Desktop potepan$ java Main double型の切り上げ : -123.0 double型の切り捨て : -124.0 double型の四捨五入 : -124
まとめ
Javaのdoube型について、使い方や変換方法などを紹介しました!
double型は、少数を扱えることから割り算の計算や変換などでよく使われるデータ型です。
精度の面からも、float型より頻繁に使われる機会が多いのです。
また、ここでも紹介したように、int型からの変換や、文字列から変換する場合などもあります。
覚えることが多いように感じるかもしれませんが、ぜひこの記事で使い方をしっかり覚えていってください!
計算結果を正確にするために、BigDecimalを使いました。
浮動小数点方式には、計算を行った際にわずかな誤差が発生することがあり、厳密な計算ができないというデメリットがあるからです。
そのため、double型でそのまま計算することはオススメできません!
計算する際は、必ずBigDecimalを用いましょう。