計算した割合が代入されていないように見える問題
勝率とか割合の計算のときに、計算結果が「0.0」となってしまう問題。
計算結果が代入されていないように見えて、わりとハマったのでメモ。
問題が発生した状況
「計算結果を表示するmainクラス」と「割合を計算するクラス」で実行。
計算結果を表示するmainクラス
package test; public class BaseBallResult2 { public static void main(String[] args){ BaseBallTeam2 team = new BaseBallTeam2(); team.setName("なる"); team.setWin(100); team.setLose(33); team.report(); } }
割合を計算するクラス
package test; class BaseBallTeam2 { private String name; private int win; private int lose; public String getName(){ return name; } public void setName(String name){ this.name = name; } public int getWin(){ return win; } public void setWin(int win){ this.win = win; } public int getLose(){ return lose; } public void setLose(int lose){ this.lose = lose; } public double getRate(){ return (double)(this.win / (this.win + this.lose)); } public void report(){ System.out.println(this.name + "の成績は" + this.win + "勝" + this.lose + "敗、勝率は" + this.getRate() + "です"); } }
表示結果
なるの成績は100勝33敗、勝率は0.0です
プログラム自体は問題なく動いているのですが、勝率が「0.0」になってしまっています。
結論
実際は値が代入されていないのではなく、int型とdouble型の型変換の問題でした。
変更箇所
「割合を計算するクラス」の以下の箇所を変更。
return (double)(this.win / (this.win + this.lose));
以下に変えただけです。
return (double)this.win / (this.win + this.lose);
表示結果
なるの成績は100勝33敗、勝率は0.7518796992481203です
Javaでは int型とint型の計算ですと、答えが少数になるような結果でも少数が切り捨てられてしまう。今回の場合、小数の結果を切り捨て、int型の「0」になったあとにdouble型に変換しているので「0.0」という結果になったよう。これを回避するためには 、double型とint型の計算にするなど、片方の数値の型を変換する必要があるとのこと。動作自体はするので、なかなか問題が見つけられなかった…