¿Por qué la división de dos números enteros devuelve 0,0 en Java? [duplicar]

Resuelto kiran asked hace 13 años • 0 respuestas
int totalOptCount = 500;
int totalRespCount=1500; 
float percentage =(float)(totalOptCount/totalRespCount);

¿Por qué esto siempre devuelve el valor 0,0? ¿También quiero formatear esto en formato 00.00 y convertirlo en una cadena?

kiran avatar Feb 08 '11 17:02 kiran
Aceptado

Porque la conversión a flotante ocurre después de que se haya realizado la división. Necesitas:

float percentage = ((float) totalOptCount) / totalRespCount;

Deberías poder formatear usando algo como:

String str = String.format("%2.02f", percentage);
unwind avatar Feb 08 '2011 10:02 unwind

Si utiliza intvalores, utilizar a doublepuede ser una mejor opción y tener menos error de redondeo. floatpuede representar intvalores sin error hasta ~16 millones. doublePuede representar con precisión todos intlos valores.

double percentage =(double) totalOptCount / totalRespCount;

Los porcentajes generalmente se multiplican por 100, lo que significa que puedes eliminar el reparto.

double percentage = 100.0 * totalOptCount / totalRespCount;
Peter Lawrey avatar Feb 08 '2011 11:02 Peter Lawrey

(totalOptCount/totalRespCount)

aquí tanto el dividendo como el divisor son de tipo, intlo que significa que solo permitirán valores enteros y la respuesta de dicha ecuación siempre será un literal entero.

Si rompo esto será algo como a continuación

(double)(500/1500)

Según el cálculo real, 500/1500 le dará 0,33333, pero el compilador lo convertirá en un literal entero porque ambos operandos son de tipo int.

(double)(0)


El compilador recibe una instrucción para convertir este 0valor al doble para obtener 0.0el resultado

0.0

y luego puedes cambiar el resultado a cualquier formato sugerido por @Zach Janicki.

tenga en cuenta que si ambos operandos son del mismo tipo, el resultado también será del mismo tipo.

Dheeresh avatar Jan 30 '2017 08:01 Dheeresh

La división de enteros (que incluye long, short, byte, char, int) en Java siempre devuelve un int (o long, si uno de los parámetros es long), redondeando hacia cero. Su conversión se produce después de este cálculo.

(La pregunta de formato ya está respondida por las otras respuestas; alternativamente, también puede echar un vistazo a java.text.NumberFormat, especialmente java.text.DecimalFormat).

Paŭlo Ebermann avatar Feb 08 '2011 10:02 Paŭlo Ebermann
String.format("%2.02f", (float)totalOptCount/totalRespCount);
Dalmas avatar Feb 08 '2011 10:02 Dalmas