なるの備忘録

エンジニアリングそして営業ができるエンジニアに向けて、日々学んだことをアウトプットしていきます。

計算した割合が代入されていないように見える問題

勝率とか割合の計算のときに、計算結果が「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型の計算にするなど、片方の数値の型を変換する必要があるとのこと。動作自体はするので、なかなか問題が見つけられなかった…