División de números enteros en Java [duplicado]

Resuelto Ben asked hace 13 años • 7 respuestas

Esta es una pregunta básica pero no encuentro una respuesta. He investigado la aritmética de coma flotante y algunos otros temas, pero nada parece abordar esto. Estoy seguro de que tengo la terminología incorrecta.

Básicamente, quiero tomar dos cantidades (completada y total) y dividirlas para obtener un porcentaje (de cuánto se ha completado). Las cantidades son longs. Aquí está la configuración:

long completed = 25000;
long total = 50000;

System.out.println(completed/total);  // Prints 0

Intenté reasignar el resultado a una impresión doble 0.0. ¿Dónde me equivoco?

Por cierto, el siguiente paso es multiplicar este resultado por 100, lo que supongo que debería ser fácil una vez superado este pequeño obstáculo.

Por cierto, aquí no hay tarea, simplemente una tontería (y tal vez demasiada codificación hoy).

Ben avatar Aug 28 '11 18:08 Ben
Aceptado

La conversión de la salida es demasiado tarde; el cálculo ya se ha realizado en aritmética de números enteros. Necesita convertir las entradas a double:

System.out.println((double)completed/(double)total);

Tenga en cuenta que en realidad no es necesario convertir ambas entradas. Mientras uno de ellos sea double, el otro se convertirá implícitamente. Pero prefiero hacer ambas cosas, por simetría.

Oliver Charlesworth avatar Aug 28 '2011 11:08 Oliver Charlesworth

Ni siquiera necesitas dobles para esto. Primero multiplica por 100 y luego divide. De lo contrario, el resultado sería menor que 1 y se truncaría a cero, como vio.

editar: o si es probable que se desborde, si se desbordara (es decir, el dividendo es mayor que 922337203685477581), primero divida el divisor por 100.

harold avatar Aug 28 '2011 12:08 harold
In Java
Integer/Integer = Integer
Integer/Double = Double//Either of numerator or denominator must be floating point number
1/10 = 0
1.0/10 = 0.1
1/10.0 = 0.1

Simplemente escriba emitir cualquiera de ellos.

Bhavya Jain avatar Jul 14 '2016 18:07 Bhavya Jain

Convierta ambos completedy totala doubleo al menos tírelos doubleal realizar la división. Es decir, lanza las variables para duplicar no sólo el resultado.

Advertencia justa, hay un problema de precisión de punto flotante al trabajar con floaty double.

Ali avatar Aug 28 '2011 11:08 Ali

Si no convierte explícitamente uno de los dos valores en un flotante antes de realizar la división, se utilizará una división entera (por eso obtiene 0). Solo necesita que uno de los dos operandos sea un valor de punto flotante, de modo que se use la división normal (y otro valor entero se convierta automáticamente en un valor flotante).

Solo intenta con

float completed = 50000.0f;

y estará bien.

Jack avatar Aug 28 '2011 11:08 Jack