Pour ce bloc de code :
int num = 5;
int denom = 7;
double d = num / denom;
la valeur de d
est 0.0
. On peut le forcer à fonctionner en le coulant :
double d = ((double) num) / denom;
Mais existe-t-il un autre moyen d'obtenir le résultat correct du double
? Je n’ai pas envie de couler des primitives, qui sait ce qui peut arriver.
double num = 5;
Cela permet d'éviter un cast. Mais vous constaterez que les conversions de cast sont bien définies. Vous n'avez pas besoin de deviner, il suffit de consulter le [JLS][1]. int vers double est une conversion d'élargissement. Extrait de [§5.1.2][2] :
Les conversions primitives d'élargissement ne perdent pas
perdent pas d'information sur la grandeur l'ampleur globale d'une valeur numérique.
[...]
Conversion d'une valeur int ou longue en flottant, ou d'une valeur longue en double, peut entraîner une perte de précision, c'est-à-dire que le résultat peut perdre certains des bits les moins significatifs de la valeur. la valeur. Dans ce cas, le résultat valeur à virgule flottante résultante sera une version correctement arrondie de la valeur entière, en utilisant le mode IEEE 754 mode d'arrondi au plus proche [(§4.2.4)][3].
5 peut être exprimé exactement comme un double.
[1] : http://docs.oracle.com/javase/specs/jls/se7/html/index.html [2] : http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 [3] : http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4
Je n’aime pas couler des primitives, qui sait ce qui peut arriver.
Pourquoi avez-vous une peur irrationnelle des primitives ? Il ne se passe rien de mal lorsque vous transformez un int
en double
. Si vous n’êtes pas sûr de savoir comment cela fonctionne, consultez la [Spécification du langage Java][1]. Le remplacement d'un int
par un double
est une [conversion primitive d'élargissement][2].
Vous pouvez vous débarrasser de la paire de parenthèses supplémentaire en coulant le dénominateur au lieu du numérateur :
double d = num / (double) denom;
[1] : http://docs.oracle.com/javase/specs/jls/se7/html/index.html [2] : http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2