型の一致しない計算とキャスト

同じ型どうしの計算

型が同じ時はあまり問題はありません。

int a,b,s;
a = 4;
b = 3;
s = a + b;    //int どうしの計算は結果もint
System.out.println(s);

a,b,cが全部intのとき、このようにまとめて宣言できます。

結果はもちろん、

7

ただし、intどうしの割り算では答えもintになります。

int a,b,s;
a = 5;
b = 3;
s = a / b;    //int どうしの計算は結果もint → 切り捨てになる
System.out.println(s);

結果は 1.6666... ではなく、

1

これは s がintだから切り捨てられるのではなく、a/b の時点で1になるのです。

異なる型どうしの計算

型の異なる計算では大きな型の方に合わせて計算します。次の例では double の a と int の k の演算です。doubleに合わせて計算されます。したがって、結果を代入する s は double でないとなりません。

double a,s;
int k;
a = 3.6;
k = 3;
s = a + k;    //int と double の計算はdoubleで行われる。結果もdouble。
System.out.println(s);

結果はもちろん、

6.6

もしも、s が int の変数だとコンパイル時に「精度が落ちている可能性」というエラーになります。

型の変換

結果が切り捨てられてしまうintどうしの割り算でも、少なくとも一方の変数をdoubleに変換すればdoubleで計算してくれます。

int a,b;
double s;
a = 5;
b = 3;
s = (double)a / b;    //片方をdoubleに変換するとdoubleで計算する。結果もdouble。
System.out.println(s);

結果は、

1.6666666666666667

(double)a で a の中から数値が取り出された後、doubleに変換されます。それと int の b との計算は型の大きいdoubleに揃えて行われます。それを double の変数 s に代入し、表示されます。

変数 a はあくまで int の変数のままです。

計算結果を int の変数に代入しようとすればもちろんコンパイル時に「精度が落ちている可能性」というエラーになります。

このような型の変換をキャストといいます。

小さな型へのキャスト

doubleからintへのキャストもできます。ただし、小数点以下の値を持つdoubleをintに変換すれば小数点以下が失われます。確実に「精度が落ちる」のですが、キャストを使うときには「精度が落ちている可能性」というエラーにはなりません。

精度が落ちない値であるか落ちても問題ないことがはっきり分かっているときだけ使うということにしないと正しい計算がでず、エラーも出ないので危険です。

double a,b,s;
int k;
a = 23;
b = 3;
s = a / b;    
k = (int)s;    //doubleをintにキャスト。小数点以下は切り捨てられる
System.out.println(s);
System.out.println(k);

結果は、

7.666666666666667
7

演習

1. 切り捨てを確認

int どうしの計算が切り捨てになる例をつくりなさい。5,3を適当な数値にして確認しなさい。

ファイル名 Kata.java

public class Kata { 
    public static void main( String[] args ) {
        int a,b,s;
        a = 5;
        b = 3;
        s = a / b;    //int どうしの計算は結果もint → 切り捨てになる
        System.out.println(s);
    } 
}

2. 切り捨てを確認

計算結果をdoubleに代入しても変わらないことを確認しなさい。

ファイル名 Kata2.java

public class Kata2 { 
    public static void main( String[] args ) {
        int a,b;
        double s;
        a = 5;
        b = 3;
        s = a / b;    //int どうしの計算は結果もint → s を doubleにしても変わらない
        System.out.println(s);
    } 
}

3. 切り捨てにならないことを確認

片方をdoubleに変換するとdoubleで計算することを確認しなさい。

ファイル名 Kata3.java

public class Kata3 { 
    public static void main( String[] args ) {
        int a,b;
        double s;
        a = 5;
        b = 3;
        s = (double)a / b;
        System.out.println(s);
    } 
}

Javaプログラミング(Apr.2011)
聖愛中学高等学校
http://www.seiai.ed.jp/