int en double, ce que Java fait réellement derrière cette opération, et dans quels cas il vaut mieux éviter de convertir trop tôt. L’objectif est simple: vous laisser avec un code propre, lisible et prévisible.
Les points essentiels à garder en tête avant de convertir un entier
- En Java, le passage de
intàdoubleest une conversion d’élargissement et ne demande pas de cast obligatoire. - La conversion elle-même est exacte pour un
int; le vrai risque arrive surtout pendant les calculs mixtes. - Si vous faites une division entière avant la conversion, vous perdez déjà l’information décimale.
- Pour un objet, je préfère
Double.valueOf(...)aux constructeursDoubledépréciés dans les JDK récents. - Pour l’argent et les valeurs décimales exactes,
doublen’est pas toujours le bon choix.

Les façons les plus simples de convertir un entier en double
Dans le code courant, la version la plus courte est aussi la meilleure: double d = monEntier;. Java applique automatiquement une widening primitive conversion, c’est-à-dire une conversion primitive d’élargissement. Si vous voulez rendre l’intention plus explicite pour la lecture du code, un cast (double) reste parfaitement valide, même s’il n’est pas nécessaire.
| Forme | Résultat | Quand je la choisis |
|---|---|---|
double d = i; |
Conversion implicite | Quasi toujours, parce que c’est simple et idiomatique |
double d = (double) i; |
Conversion explicite | Quand je veux rendre l’intention visible dans un code très dense |
Double d = Double.valueOf(i); |
Objet Double
|
Pour les API, les collections ou un champ nullable |
new Double(i) |
Objet Double
|
À éviter, car les constructeurs sont dépréciés dans les versions récentes |
int age = 27;
double ageAsDouble = age;
double explicit = (double) age;
Integer boxedAge = Integer.valueOf(age);
double fromBoxed = boxedAge;
Double objectValue = Double.valueOf(age);
Le point important ici, c’est qu’il n’y a pas de syntaxe “magique” à retenir. Pour une valeur primitive, l’affectation suffit. Pour un objet, je vise plutôt Double.valueOf que les anciens constructeurs, et je garde le cast explicite uniquement quand il améliore la lisibilité.
Ce que Java fait réellement pendant la conversion
La spécification du langage Java classe int vers double parmi les conversions primitives d’élargissement. En pratique, cela veut dire trois choses utiles: la valeur entière est conservée exactement, la conversion ne déclenche pas d’exception à l’exécution, et le passage se fait vers un format flottant de 64 bits. Autrement dit, convertir un int en double n’est pas un arrondi approximatif à ce stade-là.
Je retiens aussi un détail qui évite beaucoup de confusions: un int Java est un entier signé sur 32 bits, alors qu’un double repose sur un format flottant IEEE 754 de 64 bits. Le flottant a donc beaucoup plus d’espace, ce qui explique pourquoi tous les int peuvent y entrer sans perte. Le vrai changement n’est pas la valeur de départ, mais le type numérique dans lequel vous allez ensuite travailler.
- Conversion directe : l’entier devient un flottant sans perte de valeur.
- Pas d’exception : la conversion elle-même est sûre.
- Limite à connaître : la précision devient surtout un sujet quand vous mélangez plusieurs opérations ou quand vous revenez vers un entier.
Cette base est rassurante, mais elle ne suffit pas à éviter les erreurs les plus courantes dans les calculs. C’est justement là que le comportement des opérateurs compte plus que la conversion elle-même.
Le piège le plus fréquent reste la division entière
Le bug classique n’est pas “comment convertir”, mais “à quel moment convertir”. Si les deux opérandes d’une division sont des entiers, Java effectue d’abord une division entière, puis seulement le résultat est éventuellement converti en double. C’est pour cela que l’ordre des opérations change tout.
int a = 5;
double r1 = a / 2; // 2.0, car 5 / 2 est évalué en division entière
double r2 = a / 2.0; // 2.5, car 2.0 force le calcul en double
double r3 = (double) a / 2; // 2.5, conversion avant l'opération
Le réflexe que je conseille est simple: si vous attendez une fraction, faites entrer au moins un opérande dans le monde du double avant le calcul. Une conversion placée après la division ne peut pas reconstruire une décimale déjà perdue. C’est une erreur minuscule à l’écran, mais elle change complètement le résultat métier dans un calcul de moyenne, de pourcentage ou de ratio.
Dans une base de code réelle, je regarde donc toujours si la conversion sert à stocker une valeur ou à piloter un calcul. Dans le deuxième cas, le bon emplacement du cast est souvent plus important que le cast lui-même.
Les objets Integer et Double demandent un peu plus d’attention
Dès que vous sortez des primitives, le sujet devient légèrement plus technique. Un Integer peut être transformé en double par déballage automatique puis élargissement. C’est pratique, mais ça ajoute une contrainte que je ne néglige jamais: si la valeur objet est null, l’unboxing déclenche une NullPointerException.
Integer boxed = 42;
double primitive = boxed; // unboxing puis widening
Double object = Double.valueOf(boxed); // objet Double, utile pour une API ou une collection
Integer risky = null;
// double broken = risky; // NullPointerException
La bonne règle de terrain est la suivante: si vous calculez, gardez la primitive double. Si vous devez stocker une valeur dans une collection, exposer une propriété nullable ou satisfaire une API orientée objet, utilisez Double. Dans ce cas, je préfère Double.valueOf(...), parce que les constructeurs Double sont dépréciés dans les JDK récents et n’apportent aucun avantage réel.
Le point à retenir n’est pas seulement “objet ou primitive”, mais “est-ce que ce type sert au calcul ou au transport de la donnée ?”. Cette distinction évite beaucoup de code inutilement verbeux.
Choisir double ou autre chose selon le cas d’usage
Une conversion d’entier vers double est pertinente quand vous travaillez avec des mesures, des statistiques, des coordonnées, des moyennes ou des pourcentages. En revanche, si la valeur représente de l’argent, une quantité comptable ou un identifiant, je ne passe pas au flottant par automatisme. Le bon type dépend de la nature du problème, pas seulement de la syntaxe la plus courte.
| Cas d’usage | Type que je privilégie | Raison |
|---|---|---|
| Mesures, angles, graphiques, statistiques | double |
Les approximations sont acceptables et souvent attendues |
| Comptage, index, identifiants, tailles |
int ou long
|
Vous voulez une valeur entière exacte |
| Argent, facturation, décimales exactes | BigDecimal |
Le binaire flottant n’est pas le meilleur modèle pour les centimes |
| Très grands entiers |
long ou BigInteger
|
Vous dépassez simplement l’échelle d’un int
|
Je suis assez direct sur ce point: le double est excellent pour l’approximation, pas pour simuler de la monnaie au centime près. Si votre besoin est métier et exige un arrondi maîtrisé, passer d’un entier à un flottant n’est pas la bonne décision architecturale. Le bon type numérique évite souvent plus de bugs que dix lignes de correction derrière.
Les réflexes que j’applique avant de valider ce code
- Je convertis avant le calcul si j’attends un résultat décimal.
- Je garde l’affectation primitive la plus simple possible quand je n’ai pas besoin d’un objet.
- Je n’utilise
Doubleque si une API, une collection ou un champ nullable l’exige vraiment. - Je vérifie les valeurs
nullavant tout unboxing. - Je passe à
BigDecimaldès que la précision décimale fait partie de la règle métier.
En pratique, la conversion d’un int vers double est l’une des opérations les plus sûres de Java. Ce qui mérite votre attention, ce n’est pas le passage en lui-même, mais le moment où il se produit, le type d’opération qui l’entoure et la logique métier que vous essayez de modéliser. C’est ce tri-là qui fait la différence entre un code juste, et un code qui a l’air juste tout en produisant des résultats faux.