在我的任务中,我必须制作一个简单版本的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");
}
}
答案 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;
由于myWins
,myLosses
和i
都是整数,因此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。在进行整数运算时,不考虑小数部分。