为什么我的程序只返回零?

时间:2014-08-05 20:56:11

标签: java

我正在编写夏季课程的代码,所以我不必参加学校的入门技术课程。

public class Family {
   public static void main(String[] args) throws IOException {
      String token = "";
      int counter = 0, boyBoy = 0, boyGirl = 0, girlGirl = 0;
      double ratioBB = 0.0, ratioBG = 0.0, ratioGG = 0.0;

      Scanner inFile = new Scanner(new File("MaleFemale.txt"));
      DecimalFormat df = new DecimalFormat("#.##");

      while (inFile.hasNextLine()) {
         counter++;
         token = inFile.nextLine( );
              if(token.equals("BB")) boyBoy++;
         else if(token.equals("BG") || token.equals("GB")) boyGirl++;
         else girlGirl++;
      }

      ratioBB = (boyBoy / counter) * 100;
      ratioBG = (boyGirl / counter) * 100;
      ratioGG = (girlGirl / counter) * 100;
      df.format(ratioBB);
      df.format(ratioBG);
      df.format(ratioGG);

      System.out.println("Sample Size: " + counter);
      System.out.println("Two Boys: " + ratioBB);
      System.out.println("Boy and Girl: " + ratioBG);
      System.out.println("Two Girls: " + ratioGG);
    }
}

但是,每当我使用附带的文本文件运行程序时(参见下面的剧透),最后三个打印语句总是返回零。这是怎么回事?

以下是正在读取的文件示例:

MaleFemale.txt

GB
BG
BG
GG
GB
GB
GB
GB
BG
BG
GB
GG
BG
BG
GG
....

真实文本文件是150000这些类型的条目,数据量是否与此有关?非常感谢你。

4 个答案:

答案 0 :(得分:5)

您正在Java中执行整数除法,这必须产生另一个整数。所以,除非他们都是男孩或所有女孩,否则#34;除了反击之外的任何东西。除以" counter"收益率0

将其中一个投射到double以强制浮点运算。

ratioBB = ((double) boyBoy / counter) * 100;

您可以对该行后面的行中的其他分部执行相同的操作。

每次使用时,您也忽略了String的{​​{1}}输出。使用返回值;它不会改变输入的数字。

df.format

答案 1 :(得分:4)

你的问题在于:

int boyBoy = 0, boyGirl = 0, girlGirl = 0, counter = 0;

ratioBB = (boyBoy / counter) * 100;
ratioBG = (boyGirl / counter) * 100;
ratioGG = (girlGirl / counter) * 100;

由于涉及的所有变量都是整数,因此(boyBoy / counter)的编译将返回一个整数,向下舍入。因为boyBoy / counter保证小于1,所以它会向下舍入为0.

相反,尝试在分割之前将整数转换为双精度,因为它们将返回实际比率。然后,乘以100,而不是乘以100.0,乘以100也将转换为整数。

ratioBB = ((double) boyBoy / counter) * 100.0;

第一个表达式转换为double,乘法也转换为double。反过来说,你会遇到这个问题。

这些被称为隐式演员表,随着时间的推移,你将学会注意它们。

答案 2 :(得分:2)

将int除以int (boyBoy / counter)时,结果也是int。如果结果< 1,它将被截断为0。

你可以通过在分割前加倍加倍来修复它:((double)boyBoy / counter)

答案 3 :(得分:2)

除了在其他答案中已经提到的整数除法之外,您的扫描循环是错误的。您的单个令牌似乎被空格分隔,并且没有换行符,但您正在使用inFile.hasNextLine()inFile.nextLine()读取整行。因此inFile.nextLine()将返回整个文件内容!

相反,请使用inFile.hasNext()inFile.next()仅读取单个令牌:

while (inFile.hasNext()) {
    counter++;
    String token = inFile.next( );
    if (token.equals("BB")) boyBoy++;
    else if (token.equals("BG") || token.equals("GB")) boyGirl++;
    else girlGirl++;
}