整数同士の割り算で小数が消える理由
int / int はintで計算されます。キャストの位置による結果の違いを扱います。
なぜエラーが出ないのか
出力: 2.0
(エラーなし)- javacは何も報告しません。文法として正しいためです
出力: 2.0- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int a = 5; 4 int b = 2; 5 double r = a / b; ^ 6 System.out.println(r); 7 } 8 }
出力: 2.0期待: 2.5 (コンパイルは通っています)
int同士の割り算はintで計算され、小数が切り捨てられます。割る前にキャストが要ります。
直し方: a を (double) a にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 int correct = 3; 4 int total = 7; 5 System.out.println(correct * 100 / total + "%"); ^ 6 } 7 }
出力: 42%期待: 42.857142857142854% (コンパイルは通っています)
どこか1箇所をdoubleにすると式全体がdoubleで計算されます。掛ける順序でも結果が変わります。
直し方: 100 を 100.0 にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 int[] scores = {70, 85, 90}; 4 int sum = scores[0] + scores[1] + scores[2]; 5 double average = sum / scores.length ; ^ 6 System.out.println(average); 7 } 8 }
出力: 81.0期待: 81.66666666666667 (コンパイルは通っています)
sumもscores.lengthもint型なので、割り算の結果もintになります。どちらかをdoubleにキャストしてから割ります。
直し方: scores.length を (double) scores.length にします。
よくある誤解
結果をdoubleで受けても手遅れです。割り算が終わったあとに変換しても、切り捨てられた小数は戻りません。
まとめ
整数同士の割り算で小数が消える理由は中級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。