今回はJavaの基本データ型についてのキャストとプロモーションをテーマにした問題です。
問題
次のプログラムを実行した場合に出力される結果を選びなさい。
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 2;
double result = a / b;
System.out.println(result);
}
}
選択肢
- A. 2.5
- B. 2.0
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
B. 2.0
解説
解説のポイント:
- 整数演算における切り捨てと結果の型
- キャストの方法
- 演算結果の格納
Javaではint型同士の除算は整数演算となり、その結果も整数型で返されます。つまり、5 / 2
では小数点以下が切り捨てられ、結果は「2」となります。
その後、結果の2はdouble型に格納されるため「2.0」として出力されます。重要なのは、除算結果がdoubleの変数に代入される時点で小数点以下の情報が失われているという点です。
正しく小数点以下を保持したい場合には、どちらかのオペランドをキャストしてdouble型にする必要があります。例えば、(double) a / b
のようにしておけば、演算は浮動小数点として行われ「2.5」という結果が得られます。
これが初心者がつまづきやすいポイントの一つです。
Javaの演算においては意図するデータ型に変換されるように注意が必要です。
例えば、「整数演算では小数は完全に無視される」ため、得たい結果によって適切なキャストが必要です。
一見何も問題がないように思えるコードが異なる結果を生むことがあります。このような問題は実務でも発生することがあるため、事前にキャストする癖をつけることは重要です。
発展的な知識としては、Javaにはオートボクシングといった整数を自動的に参照型(Integer)に変換する機能も存在するため、異なる型間の挙動にも注意を払う必要があります。
修正例
public class Main {
public static void main(String[] args) {
int a = 5;
int b = 2;
double result = (double) a / b;
System.out.println(result);
}
}