Error con la división usando tipo doble en Java
-
20-09-2019 - |
Pregunta
Está bien. He dale que dale mi cabeza contra la pared para como 2 horas, ahora tratando de averiguar por qué en el double answer = 364/365;
mundo me está diciendo que answer
es 0. O cualquier otra combinación de double
para el caso, es sólo truncar el decimal y acabo de Don sé por qué.
Solución
364/365 realiza la división de enteros (trunca el decimal).
double answer = 364.0/365;
la fuerce a realizar la división de coma flotante.
Algo así como:
double days_in_year = 365;
double answer = 364/days_in_year;
funcionaría también, puesto que uno de los operandos no es un entero.
Otros consejos
Usted está tomando un tipo int (364) y dividiendo por otro tipo int (365) - la respuesta va a ser un int. Esto se almacena entonces en una respuesta de tipo doble. Se podría hacer lo siguiente:
double answer = 364d / 365d;
Más información aquí:
Es necesario hacer hacer doble división. En este momento Java está interpretando como división de enteros y devolver el int
truncado.
Lo que necesita es:
double answer = 364 / 365.0;
o
double answer = 364 / (double) 365;
La razón es que el tipo predeterminado de literales enteros en Java es int
y todo el resultado de todo arithemetic basado int
está fundido Tipo de nuevo a int
. Por lo tanto, aunque su respuesta es 0,997, cuando se typecasted vuelta se convierte en 0:
(int)0.997 = 0
Así que usted puede hacer como esto:
364.0/365.0
o
((float)364)/365
Todas las respuestas anteriores son correctas, sería simplemente añadir que todo se trata de Gigo.
double answer = 364/365;
en el código de tipo doble implica sólo para responder a la expresión variable y aritmética tiene dos operandos de tipo int. Así que la salida de la expresión aritmética es también de tipo int, que es entonces a través de auto arriba de fundición a presión a doble tipo da salida 0.0, al igual que por debajo de ejemplos:
double ans = 4.0/0;
el código anterior dará Infinity salida como uno de los operandos es el número de coma flotante de modo a través de auto tipo de fundición a presión 0 se convierte en 0,0 y el resultado es como por el tipo de datos de punto flotante.
mientras
double ans = 4/0;
dará java.lang.ArithmeticException:. / Por cero excepción en tiempo de ejecución ya que tanto los operandos son de tipo de datos int y lo que la salida es de acuerdo con el tipo de datos entero independientemente de ans tipo de datos variable de ser doble