型が同じ時はあまり問題はありません。
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
int どうしの計算が切り捨てになる例をつくりなさい。5,3を適当な数値にして確認しなさい。
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); } }
計算結果をdoubleに代入しても変わらないことを確認しなさい。
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); } }
片方をdoubleに変換するとdoubleで計算することを確認しなさい。
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); } }