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

devuelve 0% sin importar lo cansado. Intenté enviarlo a int, double, floatNo puedo dividir dos números correctamente

¿Por qué devuelve 0% para un número como score = 5 numberOfQuestions = 8?

+0

puede usar 100.0 para convertirlo a punto flotante automáticamente – Eduardo

+3

Ignore los consejos para usar el punto flotante. Claro, resolvería este problema, pero en su lugar obtendrá otros problemas y su próxima pregunta probablemente sea sobre cómo reducir la cantidad de decimales. – harold

+0

@Eduardo No, eso sería '(5/8) * 100.0', que es' 0 * 100.0', que es '0.0'. El lanzamiento a 'double' sucedería * después * de la división entera. – Eric

Respuesta

13

El problema es que dividir dos enteros le da la parte entera del resultado. Así, (score/numberOfQuestions) habrá siempre 0.
Lo que debe hacer es

int percent = (score * 100/numberOfQuestions); 

Entonces el *100 se ejecutará en primer lugar, a continuación, la brecha le dará resultado correcto.

+0

+1 Esta es absolutamente la mejor manera de manejar la operación, usando solo 'int' math. – Eric

+2

Una cosa que no entiendo: si 'score' es un número entero, ¿por qué multiplicarlo por 100 lo convierte en un doble? – user1301428

+0

@ user1301428 no lo convierte en un doble. Sigue siendo un número entero, pero es una forma más rápida de encontrar el porcentaje de números sin convertir a otra forma. –

4

Es necesario lanzar sobre cualquiera de ellos: -

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

Dado que, 5/10 ya es 0 .. Lanzar el resultado final de cualquier tipo le dará solamente 0, como en código de abajo: -

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

Esto también le dará 0.0. Dado que está emitiendo 0 para flotar. No importa ...

2

Está utilizando un int (número entero) para almacenar ese porcentaje. Trate de usar float o double en lugar de hacer la puntuación y el número de preguntas float o double también (Gracias por los comentarios, me salté esto ...). Si tiene problemas que muestran el valor, le sugiero que use DecimalFormat para formatearlo.

En lugar de usar matemática pura int para calcular y almacenar el porcentaje, sugiero esta otra alternativa si quiere tener decimales en su resultado.

+0

¡Estás asumiendo que 'score' y' numberOfQuestions' son del tipo 'double'! –

+0

Solo usar el doble para 'porcentaje' no resolverá ningún problema, ya que los cálculos del lado derecho operan todos los enunciados ->' (puntaje/número de preguntas) 'será 0 si' puntaje halex

+0

Totalmente correcto, mis disculpas. Estaba asumiendo lo que dijo @RichardJPLeGuen. He explicado los bits que faltan de mi respuesta. – Gamb

3

Compruebe su matemática entera. El código no funcionará sin el casting para valores pequeños, por lo que sólo se mueven en torno a las operaciones:

int percent = 100*score/numberOfQuestions; 
1

score/numberOfQuestions siempre proporcionará un número entre 0 y 1. Usted tiene dos opciones dependiendo de cómo es exacto que necesita su cálculo. Para la mayoría de las cosas, puede cambiar la expresión a (score * 100)/numberOfQUestions. Esto le dará dos dígitos de precisión. Se produciría un problema si score * 100 se desbordara un int. Dados sus nombres de variable, dudo que esto suceda en este caso. La segunda posibilidad sería convertir la expresión en doble para el cálculo.

0
int percent=(int)(((double)score/numberOfQuestions)*100); 
Cuestiones relacionadas