整数除算


前回に算術計算後のデータ型についてみました。そこで特に注意をしなければならない整数除算についてみていきます。整数除算とは整数を整数で割った結果です。

計算結果後のデータ型

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
整数除算の対象は上記黄色の部分です。整数型(byte , short , int) と 整数型(byte , short , int) の計算結果は整数型(int型)になることを表しています。割り算の結果も当然整数型になります。つまり

整数型を整数型で割ると整数部分のみになり小数点が切捨てられる

ということです。

【サンプル】

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
   }
}
変数a と 変数b は整数型(int)です。6行目は計算結果を直接表示しています。「10/4 = 2.5」と期待したいところですが結果は「2」になります。整数型同士の結果は整数型になるので小数部分0.5は切り捨てられます。

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」になります。キャストについては後々詳しく記事にしたいと思います。

今回は計算結果のデータ型で特に注意が必要な整数除算についてみていきました。整数同士の結果は整数部分しか返さないことをしっかり頭に入れておかないと思わぬバグ原因になるのでしっかり意識するようにしましょう。


[Java 演算子 関連記事]

「整数除算」への1件のフィードバック

  1. androidアプリ開発をしておりまして、どうしても、パーセントの表示がうまくいかないところ、こちらのサイトにたどり着けました。問題が解決しました。ありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です