整数除算
前回に算術計算後のデータ型についてみました。そこで特に注意をしなければならない整数除算についてみていきます。整数除算とは整数を整数で割った結果です。
計算結果後のデータ型
| byte | short | int | long | float | double | |
|---|---|---|---|---|---|---|
| byte | int | int | int | long | float | double |
| short | int | int | int | long | float | double |
| int | int | int | int | long | float | double |
| long | long | long | long | long | float | double |
| float | float | float | float | float | float | double |
| double | double | double | double | double | double | double |
整数型を整数型で割ると整数部分のみになり小数点が切捨てられる
ということです。
【サンプル】
public class sample01 {
public static void main(String[] args) {
int a = 10;
int b = 4;
double result = a / b;
System.out.println( a / b ); //結果:2
System.out.println( result ); //結果:2.0
}
}
5行目で計算結果をdouble型の変数に入れ7行目で表示してみます。計算結果「2」になった後にdouble型の変数に代入するので0.5は切り捨てられています。double型なので結果は「2.0」です。
【サンプル】
public class sample01 {
public static void main(String[] args) {
System.out.println( 30 / 50 * 100 ); //結果:0
}
}
リテラルでも同様です。サンプルのように割り算して100を掛ける計算。割合を求める計算式としてよく使います。
「30/50*100 = 60」と期待したいところですが結果は「0」になります。「30/50」の時点で整数除算により結果が「0」になっています。0に100を掛けても0です。
整数除算対策
【サンプル】
public class sample01 {
public static void main(String[] args) {
System.out.println( 100*30/50 ); //結果:60
System.out.println( 1.0*30/50*100 ); //結果:60.0
System.out.println( (double)30/50*100 ); //結果:60.0
}
}
3行目は計算順序の工夫です。割合を求めるときに先に100を掛けてから計算すれば「0」にはなりません。割り切れない場合は整数乗算がまだ生きていますので小数点以下は切り捨てられます。
4行目は少し強引です。「1.0*30」は実数×整数で結果は浮動小数点型になります。これに整数である50で割っても整数除算にはなりません。「1.0*30/50 = 0.6」なので100を掛けたら「60.0」になります。
5行目はキャストという手法です。簡単に言えば型変換です。(double)30 とすることで30のint型リテラルがdouble型リテラルに型変換します。この30は整数型ではないので「30/50」は整数型同士ではなく整数除算になりません。「30/50 = 0.6」に100を掛けるので「60.0」になります。キャストについては後々詳しく記事にしたいと思います。
今回は計算結果のデータ型で特に注意が必要な整数除算についてみていきました。整数同士の結果は整数部分しか返さないことをしっかり頭に入れておかないと思わぬバグ原因になるのでしっかり意識するようにしましょう。
2010 年 2 月 24 日 水曜日 【 カテゴリー: Javaの基本 】
