1

2 つの数値を割ってパーセンテージを取得し、それを出力しようとしています。関連するメソッドは次のとおりです。

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.length10 です。デバッガを使用してこれを確認しました。

パーセント変数の値が 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 <--- これは「整数」の除算であるため、除算して double データ値を作成することはできません。整数は 10 進数を生成できないため、これをゼロに変更します。
  • したがって、 0*100 = は最後に 0 を返します

あなたが間違ったことを説明した後、私は正しいことを説明し、それをあなたに説明します.

  • 最初に最も多くの票を 100 で「掛ける」: (mostVotes*100) これで完全な数が作成されます。整数。
  • 現在は 6*100 = 600 です。
  • それを「10」である votes.length で割ります。
  • 次に 60 を受け取ります。<--- これがあなたの答えです。

    (最多投票数*100) / 投票数.長さ

この背後にある理由は、この計算方法では実際に 10 進数に遭遇することがないためです。

  1. you first 6*100 = 600 <--- 10 進数なし (倍精度は含まれません)
  2. 次に、600/10 = 60 <--- 10 進数なし (倍精度は含まれません) を実行します。

もちろん、mostVotes を double に変更することもできます。しかし、これを行うことは、より便利な方法です。

これは「アルゴリズムの問​​題」であり、プログラミングの問題ではありません。

于 2013-11-12T04:03:20.493 に答える