¿Por qué la división de dos números enteros devuelve 0,0 en Java? [duplicar]
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?
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);
Si utiliza int
valores, utilizar a double
puede ser una mejor opción y tener menos error de redondeo. float
puede representar int
valores sin error hasta ~16 millones. double
Puede representar con precisión todos int
los 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;
(totalOptCount/totalRespCount)
aquí tanto el dividendo como el divisor son de tipo, int
lo 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 0
valor al doble para obtener 0.0
el 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.
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).
String.format("%2.02f", (float)totalOptCount/totalRespCount);