División de números enteros en Java [duplicado]
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 long
s. 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).
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.
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.
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.
Convierta ambos completed
y total
a double
o al menos tírelos double
al 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 float
y double
.
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.