型変換 (キャスト)
7 割る 2 が 3 になってしまう
平均や命中率を出そうとすると、最初に必ずここでつまずきます。
Java
int total = 7;
int count = 2;
double average = total / count; // 3.0 になる。3.5 ではないtotal も count も int なので、Java は整数どうしの割り算として 3 を出し、そのあと double の変数に入れるときに 3.0 へ広げます。小数点以下は、代入するより前にもう捨てられています。
小さい型から大きい型へは、Java が黙って広げてくれます。int から double、int から long は書くだけで通ります。逆に大きい型から小さい型へは桁が落ちるので、自分で指示しなければなりません。この指示がキャストです。
キャストは、割り算より前に置く
(double) を値の前に書くと、その値を double として扱えます。片方さえ double になれば、もう片方も自動的に格上げされて小数の割り算になります。
Java
int hits = 7;
int shots = 2;
double r1 = (double) hits / shots; // 3.5
double r2 = hits / (double) shots; // 3.5
double r3 = (double) (hits / shots); // 3.0 効いていないr3 は括弧の中で整数の割り算が終わってから double にしているので、消えた小数は戻ってきません。キャストは割り算が起きる前の、どちらかの値に付ける。これが唯一のコツです。
小さい型へ移すと、こぼれる
逆向きに double から int へ移すときは (int) と書きます。このとき小数部は四捨五入ではなく切り捨てになります。
Java
int a = (int) 3.7; // 3
int b = (int) -3.7; // -33.7 は 4 になりません。四捨五入したいときは Math.round を使います。long から int のように桁数が足りない移し方をすると、値そのものが壊れてまったく違う数になりますが、キャストは「失われてもいい」という宣言なので警告は出ません。範囲に収まるかを確かめるのは書く側の仕事です。
割り算にはもう 1 つ癖があります。
intどうしで 0 で割ると実行時エラーで止まりますが、doubleの割り算は止まらずInfinityを返します。止まらないぶん、おかしな値がそのまま先の処理へ流れていきます。
要件
- クラス名は
Solution、メソッド名はdivideDouble、引数はint a, int bの 2 つ、戻り値の型はdoubleにすること - 整数除算ではなく小数演算にするため、
(double)キャストを使うこと (例:(double) a / b) b == 0の場合は0.0を返し、ArithmeticExceptionを発生させないこと
入出力例
divideDouble(7, 2) → 3.5
divideDouble(10, 4) → 2.5
divideDouble(5, 0) → 0
divideDouble(8, 2) → 4