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

时间:2012-11-12 04:51:22

标签: java math

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

import java.util.Random;

标题,注意变量

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

只需滚动两个模具并生成它们。

public int roll(){
    die1 = r.nextInt(6)+1;
    die2 = r.nextInt(6)+1;
    return(die1 + die2);
}

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++;
        }
    }
}

这就是bug,这是测试人员的方法。

public void tester(int howMany){
    int i = 0;
    while(i < howMany){
        play();
        i++;
    }

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");



}

}

4 个答案:

答案 0 :(得分:13)

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

您可以更改此分配: -

winPercent = myWins/i * 100;
lossPercent = myLosses/i* 100;

来: -

winPercent = myWins * 100.0/i;
lossPercent = myLosses * 100.0/i;

有两件事需要考虑: -

  • 通过施法使你的师成为分裂的浮点 你的分子到float: -

    winPercent = (float)(myWins)/i * 100;
    
  • 此外,在整数除法的情况下,它是关联性的问题 和优先。由于*/具有相同的优先级,并且 有从左到右的关联性。所以,myWins / i将是 首先评估。因此,这个价值很有可能 0

    因此,只需更改*/的顺序即可*发生 第一

注意,我在乘法中使用了100.0。因为乘以100会再次导致截断

答案 1 :(得分:3)

看看

  winPercent = myWins/i * 100;
  lossPercent = myLosses/i* 100;

由于myWinsmyLossesi都是整数,因此Java使用整数运算来返回结果。自myWins <= i起,myWins / i的结果始终为0或1。

您可以通过多种方式解决此问题,例如

   winPercent = (1.0f * myWins / i) * 100;

答案 2 :(得分:0)

问题陈述:

winPercent = myWins/i * 100;
lossPercent = myLosses/i* 100;

给出:
myWins或myLosses =整数
我=经纪人

原因:
除法运算可能以十进制表示,由编译器在内部以整数格式存储。由于传递的值是整数格式,因此,只有整数部分(小数部分之前)存储在临时位置中。因此实际值变为零。

解决方案:
winPercent = ((float)myWins/i)*100;

答案 3 :(得分:0)

请勿将类型转换为整数。使用float或double。在进行整数运算时,不考虑小数部分。