我正在编写夏季课程的代码,所以我不必参加学校的入门技术课程。
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这些类型的条目,数据量是否与此有关?非常感谢你。
答案 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++;
}