计算百分比"x/y*100"总是导致0?

Pat*_*nga 3 java math

在我的任务中,我必须制作一个简单版本的Craps,由于某种原因,即使两个变量都是非0,百分比赋值总是产生0,这里是代码.

import java.util.Random;
Run Code Online (Sandbox Code Playgroud)

标题,注意变量

public class Craps {
private int die1, die2,myRoll ,myBet,point,myWins,myLosses;
private double winPercent,lossPercent;
private Random r = new Random();
Run Code Online (Sandbox Code Playgroud)

只需滚动两个模具并生产一些模具.

public int roll(){
    die1 = r.nextInt(6)+1;
    die2 = r.nextInt(6)+1;
    return(die1 + die2);
}
Run Code Online (Sandbox Code Playgroud)

Play方法,这只是循环游戏.

public void play(){
    myRoll = roll();
    point = 0;

    if(myRoll == 2 ||myRoll == 3 || myRoll == 12){
        System.out.println("You lose!");
        myLosses++;
    }else if(myRoll == 7 || myRoll == 11){
        System.out.println("You win!");
        myWins++;
    }else{
        point = myRoll;
        do {
            myRoll = roll();
        }while(myRoll != 7 && myRoll != point);
        if(myRoll == point){
            System.out.println("You win!");
            myWins++;
        }else{
            System.out.println("You lose!");
            myLosses++;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是bug,这是测试器方法.

public void tester(int howMany){
    int i = 0;
    while(i < howMany){
        play();
        i++;
    }
Run Code Online (Sandbox Code Playgroud)

bug就在这些赋值语句中

    winPercent = myWins/i * 100;
    lossPercent = myLosses/i* 100;
    System.out.println("program ran "+i+" times "+winPercent+"% wins "+ lossPercent+"% losses with "+myWins+" wins and "+myLosses+" losses");



}
Run Code Online (Sandbox Code Playgroud)

}

Roh*_*ain 14

可能是因为你正在进行整数除法,而分母大于分子.所以价值将为零.

您可以更改此作业: -

winPercent = myWins/i * 100;
lossPercent = myLosses/i* 100;
Run Code Online (Sandbox Code Playgroud)

至: -

winPercent = myWins * 100.0/i;
lossPercent = myLosses * 100.0/i;
Run Code Online (Sandbox Code Playgroud)

有两件事需要考虑: -

  • 通过将你的分子转换为float: - 使你的分裂成为分裂的浮点:

    winPercent = (float)(myWins)/i * 100;
    
    Run Code Online (Sandbox Code Playgroud)
  • 而且,在整数除法的情况下,它是相关性优先性的问题.由于*/具有相同的优势,并且具有从左到右的关联性.因此,myWins / i将首先进行评估.因此,很有可能该值可以为0.

    因此,只要改变顺序*,并/使*第一发生.

注意,我用过100.0乘法.因为乘以100将再次导致截断.