Para este bloque de código:
int num = 5;
int denom = 7;
double d = num / denom;
El valor de d
es 0.0
. Se puede forzar a trabajar al lanzar:
double d = ((double) num) / denom;
Pero, ¿hay otra forma de obtener el double
resultado correcto ? No me gusta lanzar primitivas, quién sabe qué puede pasar.
java
casting
integer-division
walnutmon
fuente
fuente
Respuestas:
Eso evita un yeso. Pero encontrará que las conversiones de conversión están bien definidas. No tienes que adivinar, solo revisa el JLS . int a double es una conversión cada vez mayor. De §5.1.2 :
5 se puede expresar exactamente como un doble.
fuente
1.0
todavía cambia el tipo de resultado, simplemente de una manera diferente. 'Me parece un código sucio' no explica en qué escenario (s) cree que multiplicar1.0
es realmente mejor (o por qué podría ser).(double)num
alguna manera cambianum
. No lo hace: crea un doble temporal para el contexto de la declaración.¿Qué hay de malo en lanzar primitivas?
Si no quieres emitir por alguna razón, puedes hacer
fuente
double d = num * 1D / denom;
¿Por qué tienes un miedo irracional a lanzar primitivas? Nada malo sucederá cuando lanzas un
int
adouble
. Si no está seguro de cómo funciona, búsquelo en la Especificación del lenguaje Java . Lanzar unint
todouble
es una conversión primitiva cada vez mayor .Puedes deshacerte del par de paréntesis extra al usar el denominador en lugar del numerador:
fuente
double d = (double) num / denom;
... (OK, esto depende de la precedencia)Si cambia el tipo de una de las variables, debe recordar colarse en un doble nuevamente si su fórmula cambia, porque si esta variable deja de ser parte del cálculo, el resultado es confuso. Tengo la costumbre de emitir dentro del cálculo y agrego un comentario al lado.
Tenga en cuenta que emitir el resultado no lo hará
fuente
Emite uno de los enteros / ambos enteros para flotar para forzar que la operación se haga con coma flotante matemática. De lo contrario, siempre se prefiere la matemática entera. Entonces:
Tenga en cuenta que emitir el resultado no lo hará. Porque la primera división se realiza según la regla de precedencia.
No creo que haya ningún problema con el casting como tal en el que está pensando.
fuente
La fundición de tipos es la única forma
Producir una
double
división de enteros: no hay otra forma sin lanzar (puede que no lo hagas explícitamente, pero sucederá).Ahora, hay varias formas en que podemos tratar de conseguir precisa
double
de valor (dondenum
ydenom
sonint
tipo y de curso con la fundición ) -con casting explícito:
double d = (double) num / denom;
double d = ((double) num) / denom;
double d = num / (double) denom;
double d = (double) num / (double) denom;
pero no
double d = (double) (num / denom);
con casting implícito:
double d = num * 1.0 / denom;
double d = num / 1d / denom;
double d = ( num + 0.0 ) / denom;
double d = num; d /= denom;
pero no
double d = num / denom * 1.0;
y no
double d = 0.0 + ( num / denom );
fuente
usa algo como:
(1d es un elenco para duplicar)
fuente
Puede considerar ajustar las operaciones. Por ejemplo:
Esto le permite buscar (solo una vez) si el elenco hace exactamente lo que quiere. Este método también podría estar sujeto a pruebas, para garantizar que continúe haciendo lo que desea. Tampoco importa qué truco use para causar la división (podría usar cualquiera de las respuestas aquí), siempre que resulte en el resultado correcto. En cualquier lugar donde necesite dividir dos enteros, ahora puede llamar
Utils::divide
y confiar en que hace lo correcto.fuente
solo usa esto.
fuente
La mejor manera de hacer esto es
fuente