5

在我的作业中,我必须制作一个简单版本的胡扯,由于某种原因,即使两个变量都不为 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++;
        }
    }
}

这就是错误所在,这是测试方法。

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

错误就在这些赋值语句中

    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

4 回答 4

16

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

您可以更改此分配:-

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将再次导致截断

于 2012-11-12T04:53:02.837 回答
3

看一眼

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

由于myWins和都是整数,Java 使用整数运算来返回结果myLossesi因为myWins <= i的结果myWins / i总是 0 或 1。

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

   winPercent = (1.0f * myWins / i) * 100;
于 2012-11-12T04:55:32.940 回答
0

问题陈述:

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

给定:
myWins 或 myLosses = 整数
i = 整数

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

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

于 2018-08-13T14:10:16.727 回答
0

不要类型转换为 int。使用浮点数或双精度数。当您进行整数运算时,不考虑小数部分。

于 2018-08-13T14:17:07.343 回答