1

我试图将两个数字相除以获得百分比,然后打印出来。这是相关的方法:

public void process_winner(String candidates[], int votes[])
{
   double percent = (mostVotes / votes.length) * 100;
   if (mostVotes > votes.length / 2)
      System.out.println("Winner: " + candidates[mostVotesIndex] + "(" + percent + "%)");
   else
      System.out.println("None (no majority)");
   System.out.println("");
}

问题线是:

double percent = mostVotes / votes.length;

mostVotes是一个int,值为 6,votes.length是 10。我使用调试器验证了这一点。

它显示我的百分比变量的值为 0.0,而它应该显示 60.0

4

5 回答 5

5

您需要转换为double,或更改操作顺序。

做这个:

double percent = (mostVotes * 100 ) / votes.length;
于 2013-11-11T08:12:54.023 回答
3

您需要将其强制转换为double,否则它将是整数除法,因此会丢失精度。

double percent = ((double) mostVotes / votes.length) * 100;
于 2013-11-11T08:12:58.207 回答
1

这是整数除法,按预期工作。
如果您想double在除以整数时获得值,请使用:

double percent = mostVotes * 1.0 / votes.length;

顺便说一句,为了获得百分比,您需要将其乘以 100:

double percent = mostVotes * 100.0 / votes.length;
于 2013-11-11T08:13:05.213 回答
1

让你的公式(mostvotes * 100)/votes.length
在你的情况下,执行是:

  • mostVotes/votes.length导致 6/10 是整数除法
  • 6/10 = 0
  • 0 * 100 给出结果 0

当您将其更改为double percent = (mostVotes * 100 ) / votes.length;

执行顺序变为

  • mostVotes * 100即 6 * 100
  • 6 * 100 = 600。
  • 600/votes.length即 600/10 = 60

这应该给你正确的输出

于 2013-11-11T08:13:44.063 回答
0

您需要将其更改或“转换”为双精度。你所做的是这个

 double percent = (mostVotes / votes.length) * 100;

你认为你在做什么是这样的:

  • (6/10) = 0.6
  • 0.6*100 = 60

现在实际发生的是:

  • (6/10) = 0 <--- 这是因为它是“整数”除法,这意味着它不能除法和创建双精度数据值。它将做的是将其更改为零,因为整数不能产生十进制数字
  • 因此, 0*100 = 最后给你一个 0

知道在解释了你做错了什么之后我会解释什么是对的,然后向你解释。

  • 您首先将 mostvotes 与 100 相乘: (mostVotes*100) 现在这将创建一个完整的数字;一个整数。
  • 现在 6*100 = 600。
  • 然后我们将其除以 votes.length,即“10”
  • 然后我们收到 60。<--- 这是你的答案。

    (mostVotes*100) / votes.length

这背后的原因是因为您从未真正以这种计算方式遇到十进制数。

  1. 你首先 6*100 = 600 <--- 没有小数(没有双精度)
  2. 然后你做 600/10 = 60 <--- 没有小数(不涉及双精度)

您当然可以将 mostVotes 更改为 double。但这样做只是一种更方便的方式。

这更像是一个“算法问题”,而不是一个编程问题。

于 2013-11-12T04:03:20.493 回答