2012-10-10 16 views
9
int percent = (score/numberOfQuestions)*100; 
progressText.setText(score+"/"+numberOfQuestions+" "+percent+"%"); 

zwraca 0% bez względu na to, co zmęczyłem. Próbowałem rzucić go na int, podwójne, floatNie mogę poprawnie podzielić dwóch liczb

Dlaczego zwraca 0% dla liczby takich jak score = 5 numberOfQuestions = 8?

+0

Możesz użyć 100.0, aby automatycznie przenieść go do punktu zmiennoprzecinkowego – Eduardo

+3

Proszę zignorować tę poradę, aby użyć zmiennoprzecinkowej. Oczywiście, rozwiązałoby to ten problem, ale zamiast tego dostaniesz inny zestaw problemów, a następne pytanie będzie prawdopodobnie dotyczyło zmniejszenia liczby miejsc dziesiętnych. – harold

+0

@Eduardo Nie, to byłoby '(5/8) * 100,0', które jest' 0 * 100.0', które wynosi '0.0'. Rzucanie na 'podwójne' może się zdarzyć * po * dzieleniu całkowitym. – Eric

Odpowiedz

13

Problem polega na tym, że dwie liczby całkowite dają całkowitą część wyniku. Więc (score/numberOfQuestions) będzie zawsze 0.
Co należy zrobić, to

int percent = (score * 100/numberOfQuestions); 

Następnie *100 zostanie wykonany pierwszy, a następnie podzielić daje poprawny wynik.

+0

+1 Jest to absolutnie najlepszy sposób na operację, używając tylko 'int' matematyki. – Eric

+2

Jedna rzecz, której nie rozumiem: jeśli 'score' jest liczbą całkowitą, dlaczego pomnożenie razy 100 zmieni go w podwójne? – user1301428

+0

@ user1301428 to nie zmienia się w podwójne. Wciąż pozostaje liczbą całkowitą, ale jest szybszym sposobem na znalezienie procentu liczb bez konwersji na inną. –

4

Trzeba oddać na jedną z nich: -

float percent = ((float)score/numberOfQuestions)*100; 

Ponieważ 5/10 jest już 0 .. Casting ostateczny wynik do każdego rodzaju daje 0 tylko, jak w poniższym kodzie: -

float percent = ((float)(score/numberOfQuestions))*100; 

Daje to również 0.0. Odlewania 0, aby unosić. Nie ma znaczenia ..

2

Używasz int (liczba całkowita) do zapisania tego procentu. Spróbuj zamiast tego używać float lub double, aby uzyskać wynik i liczbę pytań: float lub double (dzięki za komentarze, całkowicie pominąłem to ...). Jeśli masz problemy z wyświetlaniem wartości, sugeruję użycie formatu DecimalFormat.

Zamiast używać czystej matematyki int do obliczenia i zapisania wartości procentowej, proponuję te inne alternatywy, jeśli chcesz mieć dziesiętne w swoim wyniku.

+0

Zakładasz, że 'score' i' numberOfQuestions' są typu 'double'! –

+0

Tylko używanie podwójnego dla "procentu" nie rozwiąże żadnych problemów, ponieważ obliczenia po prawej stronie działają na wszystkich ints -> '(score/numberOfQuestions)' będzie 0, jeśli 'score halex

+0

Zupełnie słusznie, przepraszam. Zakładałem, co powiedział @RichardJPLeGuen. Wyjaśniłem brakujące fragmenty mojej odpowiedzi. – Gamb

3

Sprawdź swoją liczbę całkowitą. Twój kod nie zadziała bez rzucania dla małych wartości, tak po prostu przenieść operacje wokół:

int percent = 100*score/numberOfQuestions; 
1

score/numberOfQuestions zawsze zapewni liczbę między 0 i 1. Masz dwie możliwości w zależności od tego, jak dokładne trzeba swoje obliczenia. W większości przypadków możesz zmienić wyrażenie na (score * 100)/numberOfQUestions. To da ci dwie cyfry dokładności. Problem może wystąpić, jeśli score * 100 przepełnił int. Biorąc pod uwagę twoje zmienne imiona, wątpię, aby tak się stało w tym przypadku. Drugą możliwością byłoby przekształcenie wyrażenia na podwójne w celu obliczenia.

0
int percent=(int)(((double)score/numberOfQuestions)*100); 
Powiązane problemy