Расчеты выходят на 0,0? - PullRequest
2 голосов
/ 03 июня 2010

Простой расчет процентов. Он не вернет значение, кроме 0.0, и я думаю, один или два раза он вернул 100.0%. Кроме этого он ничего не сделает. Я пытался играть с кодом несколькими различными способами, и он просто не будет работать.

for (int loop = 1; loop < loopCount; loop++)
            {
                aa = r.nextInt(10+1);
                abc = (int) aa;

                String[] userAnswer = new String[x];

                int totalQues = (correctAnswer + wrongAnswer), actualQues = (totalQues - 1);

                if(abc < x)
                {
                    userAnswer[abc] = JOptionPane.showInputDialog(null,"Question "+quesNum+"\n\n"+questions[abc]+"\n\nA: "+a[abc]+"\nB: "+b[abc]+"\nC: "+c[abc]+"\nD: "+d[abc]+"\nCorrect Answers: "+correctAnswer+"\nWrong Answers: "+wrongAnswer+"\nTotal Questions: "+totalQues);

                    if(userAnswer[abc].equals(answers[abc]))
                    {
                        correctAnswer++;
                    }
                    else
                    {
                        wrongAnswer++;
                    }//else

                    if(actualQues == x);
                    {
                        score = (correctAnswer / actualQues) * 100;

                        JOptionPane.showMessageDialog(null,"The test is finished.");

                        JOptionPane.showMessageDialog(null,"You scored "+score+"%");

                    }//if

                }//if

            }//for

Ответы [ 6 ]

4 голосов
/ 03 июня 2010

Изменение

score = (correctAnswer / actualQues) * 100;

до

score = ((double)correctAnswer / actualQues) * 100;
3 голосов
/ 03 июня 2010

Поскольку вы выполняете целочисленное деление, результатом этой операции всегда будет 0 или 1. Вместо этого попробуйте привести к числу с плавающей запятой перед делением:

score = (int)((correctAnswer / (1.0 * totalQues)) * 100);
2 голосов
/ 03 июня 2010

Если предположить, что correctAnswer и totalQues являются целочисленными типами, строка score = (correctAnswer / totalQues) * 100; будет использовать целочисленное деление (в результате 0 или 1). Чтобы избежать этого, вам нужно явно привести один к плавающему типу:

score = (correctAnswer / ((double)totalQues)) * 100;
1 голос
/ 03 июня 2010
score = (correctAnswer / actualQues)

Если значения correctAnswer и actualQues равны целым числам, то оценка будет каждый раз получать 0, поскольку значения типа int не могут обрабатывать десятичные значения, поэтому мы используем число с плавающей запятой.

correctAnswer и / или totalQues должны быть float / double (BigDecimal, чтобы быть педантичным). Таким образом, если один из операндов является значением с плавающей запятой, деление выполняется в арифметике с плавающей запятой вместо целочисленной арифметики ... и SHAZAM !, вы получите ненулевой (не усеченный) результат.

0 голосов
/ 04 июня 2010

Если вам не нужно или хотите удвоить, самое простое решение - сначала выполнить умножения.

score = 100 * correctAnswer / actualQues;

В этом случае оценка остается целочисленным значением.

0 голосов
/ 03 июня 2010

Приведение ( или даже объявление ) атрибутов типа " double ". Это должно сработать для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...