Почему мой метод не возвращает правильное деление?

1

Так что у меня возникают проблемы с моим printResults метод в моем TestCandidate классе. Кажется, что все работает так, как ожидалось, за исключением столбца, отображающего процент от общего количества голосов, полученных каждым кандидатом. По какой-то причине эта операция печатает только 0. (Для записи, когда я использую слово "операция", я в основном list[i].getVotes/getTotal(list) чтобы уточнить).

Я пробовал различные комбинации в скобках метода list[i].getVotes метода getTotal(list) но безрезультатно. Я также попытался выполнить операцию за пределами инструкции print и просто распечатать переменную, которой была бы назначена операция.

Странная вещь, когда я беру либо list[i].getVotes либо getTotal(list), и оставляю одно, оба они отлично печатаются. Просто не вместе, и я просто не могу понять, почему.

Итак, в list[i].getVotes/getTotal(list), почему бы не list[i].getVotes/getTotal(list) разделить правильно? (Пожалуйста, не пытайтесь делать что-либо, кроме вопроса, о котором я спрашиваю, я бы хотел узнать и исправить свои собственные ошибки и лучше всего оптимизировать свой код как можно больше, но я просто не могу пройти мимо этого по какой-либо причине). Спасибо!

Здесь класс Candidate:

public class Candidate
{       
    private int votes;
    private String candidateName;

    public Candidate(String name, int numVotes)
    {
        votes = numVotes;
        candidateName = name;       
    }
    public String getName()
    {
        return candidateName; 
    }
    public void setName(String name)
    {
        candidateName = name;
    }
    public int getVotes()
    {
        return votes;
    }
    public void setVotes(int numVotes)
    {
        votes = numVotes;
    }       
    public String toString()
    {
        return candidateName + " received:\t" + votes + " votes."; 
    }
}

Здесь класс TestCandidate:

 public class TestCandidate 
    {       
       public static void main(String[] args)
        {                             
          Candidate[] election = new Candidate[5];

        election[0] = new Candidate("John Smith", 5000);
        election[1] = new Candidate("Mary Miller", 4000);
        election[2] = new Candidate("Michael Duffy", 6000);
        election[3] = new Candidate("Tim Robinson", 2500);
        election[4] = new Candidate("Joe Ashtony", 1800); 

        printVotes(election);
      System.out.println();
      printResults(election);
      System.out.println();
        System.out.println("The total amount of votes cast was: " + getTotal(election) + ".");                                      
    }
    public static <E> void printVotes(E[] array)    //prints the candidates and the amount of votes they 
    {                                                           //each received
        for(E element : array)
        {
            System.out.printf("%s ", element);
            System.out.println();
        }
    }
    public static int getTotal(Candidate[] list)    //adds up the votes from each candidate and prints the
    {                                                           //total amount
        int totalVotes = 0;
        for(int i = 0; i < list.length; i++)
        {
            totalVotes += list[i].getVotes();
        }
        return totalVotes;
    }   
   public static void printResults(Candidate[] list)  //prints a table containing candidate name, amount of votes, and the 
   {                                                  //percentage of total votes they earned
      System.out.println("Candidate: \t Votes Recieved: \t Percent of Total Votes:");      
      for(int x = 0; x < list.length; x++)
      {                       
         System.out.println(list[x].getName() + " \t " + list[x].getVotes() + " \t \t \t " + list[x].getVotes()/getTotal(list) + "%");                
      }
   }                    
}

И вот мой текущий выход:

John Smith received:    5000 votes. 
Mary Miller received:   4000 votes. 
Michael Duffy received: 6000 votes. 
Tim Robinson received:  2500 votes. 
Joe Ashtony received:   1800 votes. 

Candidate:   Votes Recieved:     Percent of Total Votes:
John Smith       5000            0%
Mary Miller      4000            0%
Michael Duffy    6000            0%
Tim Robinson     2500            0%
Joe Ashtony      1800            0%

The total amount of votes cast was: 19300.
Теги:
arrays

3 ответа

2
Лучший ответ

чтобы получить процентные показания, чтобы правильно использовать следующую строку кода:

(double)100*list[x].getVotes()/getTotal(list)

это происходит потому, что деление целых чисел Java дает вам все эти нули, которые вы видите в своих результатах (0%):

3

Десятичное представление дроби представляет собой число от 0 до 1, которое целое число не может представлять. Кроме того, это не процент, потому что вы не умножили на 100.

Вы можете умножить на 100, прежде чем делиться, или вы можете отбросить дно фракции до (double) чтобы сохранить десятичные знаки, прежде чем умножать их на 100.

Работа с int может быть рискованной для больших чисел - предположим, что кандидат получил 30 миллионов голосов, умножив на 100, обернув его в отрицательное число, потому что int не может представлять 3 миллиарда.

2

Изображение 174551

(double)list[x].getVotes()/getTotal(list)*100
  • 0
    NB это не проценты!
  • 1
    Это больше походит на это...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню