2010-06-03 3 views
2

Un calcul en pourcentage simple. Il ne retournera pas une valeur sauf 0.0 et je pense qu'une ou deux fois il a retourné 100.0%. À part ça, ça ne fera rien. J'ai essayé de jouer avec le code de plusieurs manières différentes et ça ne marchera pas.Calculs sortant à 0.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 
+0

aa = r.nextInt (10 + 1) Y a-t-il une raison pour laquelle vous faites cela? C'est la même chose que aa = r.nextInt (11). Vous pouvez vouloir aa = r.nextInt (10) + 1. –

Répondre

1
score = (correctAnswer/actualQues) 

Si les deux correctAnswer et actualQues sont int de score de obtiendrez alors 0 à chaque fois, parce que les valeurs int ne peuvent pas gérer les valeurs décimales, c'est pourquoi nous utilisons à virgule flottante.

correctAnswer et/ou totalQues devrait être float/double (BigDecimal pour être pédant). De cette façon, avec un des opérandes étant une valeur à virgule flottante, la division est faite en arithmétique à virgule flottante, au lieu de l'arithmétique entière. SHAZAM !, vous obtiendrez un résultat non nul (non tronqué).

+0

merci! Cela a résolu \ m / –

4

changement

score = (correctAnswer/actualQues) * 100; 

à

score = ((double)correctAnswer/actualQues) * 100; 
3

Puisque vous faites la division entière, le résultat de cette opération sera toujours 0 ou 1. Au lieu de cela, essayez de jeter à un nombre à virgule flottante avant la division:

score = (int)((correctAnswer/(1.0 * totalQues)) * 100); 
2

En supposant à la fois correctAnswer et totalQues sont des types entiers, la ligne score = (correctAnswer/totalQues) * 100; utilisera une division entière (résultant en 0 ou 1). Pour éviter cela, vous devez explicitement jeter un à un type flottant:

score = (correctAnswer/((double)totalQues)) * 100; 
0

Ensemble (ou même déclarer) les attributs de type « à double ». Cela devrait fonctionner pour vous.

0

Si vous n'en avez pas besoin ou si vous voulez un double, la solution la plus simple consiste à faire les multiplications en premier.

score = 100 * correctAnswer/actualQues; 

Dans ce cas, le score reste une valeur int.