Programmation Orientée Objet avec Java

04 : Éléments de Base - Types Primitifs, Affichage et Conversions

 

Types Primitifs - Nombres en Virgule Flottante

Valeurs littérales pour float et double :

123.45 // valeur de type double (par défaut)
17d // valeur de type double
-4.032F // valeur de type float
6.02e23 // 6.02 x 10²³ de type double
-5.076E-2f // -5.076 x 10⁻² de type float

Séparateurs de chiffres (Java 7+) :

Le caractère _ peut être inséré dans les littéraux numériques pour améliorer la lisibilité :

long creditCardNr = 1234_5678_9012_3456L;
int tenMillions = 10_000_000;
int bytePattern = 0b11000011_00001111_11110000_00110011;
float pi = 3.14_15_93f;
Note : Les underscores ne peuvent pas être placés :
  • Au début ou à la fin d'un nombre
  • Avant ou après un point décimal
  • Avant un suffixe (F, L, etc.)
  • Dans les positions où une série de chiffres est attendue

Cas particuliers numériques :

1.2 / 0.0 // Infini → Double.POSITIVE_INFINITY
-5.1 / 0.0 // Moins l'infini → Double.NEGATIVE_INFINITY
0.0 / 0.0 // Not a Number (NaN) → Double.NaN
Attention : Les opérations avec l'infini et NaN peuvent produire des résultats surprenants :
  • Toute opération avec NaN donne NaN
  • Infini + Infini = Infini
  • Infini - Infini = NaN
  • 0 × Infini = NaN

Affichage sur la Console

Méthodes d'affichage :

System.out.print("..."); // Affichage (reste sur la même ligne)
System.out.println("..."); // Affichage et retour à la ligne

Exemples comparatifs :

// Méthode 1 : Affichages séparés
System.out.println("Résultats");
System.out.println("---------");
// Sortie :
// Résultats
// ---------

int size = 123;
char unit = 'm';
System.out.print("Longueur : ");
System.out.print(size);
System.out.print(" ");
System.out.println(unit);
// Sortie : Longueur : 123 m
// Méthode 2 : Concaténation avec l'opérateur +
int size = 123;
char unit = 'm';
System.out.println("Longueur : " + size + " " + unit);
// Même sortie : Longueur : 123 m

Conversions de Types

Principe général :

Mis à part le type booléen, tous les types primitifs peuvent être convertis entre eux. Le type char peut être considéré comme un entier non signé.

Types de conversions :

  • Conversion élargissante (Promotion) : Automatique, sans perte d'information (sauf précision en virgule flottante)
  • Conversion restrictive (Casting) : Explicite, peut entraîner une perte d'information

 

Tableau des conversions possibles :

De \ Vers boolean byte short char int long float double
boolean N N N N N N N
byte N E R E E E E
short N R R E E E E
char N R R E E E E
int N R R R E E* E
long N R R R R E* E*
float N R! R! R! R! R! E
double N R! R! R! R! R! R*

Légende :

  • N : Pas de conversion possible
  • E : Conversion élargissante (automatique)
  • R : Conversion restrictive (nécessite un cast)
  • * : Perte de précision possible
  • ! : Valeur tronquée possible

Conversions élargissantes (automatiques) :

int i = 100;
long l = i; // Conversion automatique int → long
float f = l; // Conversion automatique long → float
double d = f; // Conversion automatique float → double

byte b = 10;
int j = b; // Conversion automatique byte → int

Conversions restrictives (casting explicite) :

double d = 100.04;
long l = (long) d; // Conversion double → long (partie entière)
int i = (int) l; // Conversion long → int

float f = (float) d; // Conversion double → float
byte b = (byte) i; // Conversion int → byte

Exemples détaillés de conversions :

// Conversion avec perte d'information
int grandNombre = 1000;
byte petitNombre = (byte) grandNombre; // Résultat : -24 (débordement)

// Conversion de caractères
char c = 'A';
int codeAscii = c; // Conversion automatique char → int (65)

// Conversion avec arrondi
double prix = 19.99;
int prixEntier = (int) prix; // Résultat : 19 (troncature)

Conversions implicites dans les expressions constantes :

short compteur = 12 * 34; // Conversion implicite int → short
byte valeur = 100 + 28; // Conversion implicite int → byte
char lettre = 65; // Conversion implicite int → char ('A')
Règle : Les conversions restrictives implicites sont autorisées uniquement pour les expressions constantes lorsque la valeur peut être représentée sans perte dans le type cible.

Exemples Pratiques Complets

Exemple 1 : Calculs avec différents types

public class ConversionsExemples {
    public static void main(String[] args) {
        // Déclarations avec différents types
        int entier = 100;
        double decimal = 123.456;
        float flottant = 45.67f;

        // Conversions automatiques
        double resultat1 = entier + decimal; // int → double
        double resultat2 = flottant * 2; // float → double

        // Conversions explicites
        int partieEntiere = (int) decimal; // 123
        byte petit = (byte) entier; // 100

        // Affichage des résultats
        System.out.println("Résultat 1: " + resultat1);
        System.out.println("Résultat 2: " + resultat2);
        System.out.println("Partie entière: " + partieEntiere);
    }
}

Exemple 2 : Gestion des cas particuliers

public class CasParticuliers {
    public static void main(String[] args) {
        // Division par zéro
        double infiniPositif = 1.0 / 0.0;
        double infiniNegatif = -5.0 / 0.0;
        double nan = 0.0 / 0.0;

        System.out.println("Infini positif: " + infiniPositif);
        System.out.println("Infini négatif: " + infiniNegatif);
        System.out.println("NaN: " + nan);
        System.out.println("Est-ce NaN? " + Double.isNaN(nan));
    }
}

Questions de Cours

Question 1: Types de littéraux

Pour chacun des littéraux suivants, indiquez son type (float, double, ou erreur) :

  • 3.14
  • 2.718f
  • 1.5e-10
  • 100
  • 0x1.8p1

Réponse :

  • 3.14 : double (par défaut)
  • 2.718f : float (suffixe f)
  • 1.5e-10 : double (notation exponentielle sans suffixe)
  • 100 : int (entier, pas un flottant)
  • 0x1.8p1 : double (notation hexadécimale pour flottants)

Question 2: Conversions automatiques

Quelles conversions automatiques seront effectuées dans l'expression suivante?

byte b = 10;
short s = 20;
char c = 'A';
int i = 30;
double resultat = b + s + c + i;

Réponse :

Les conversions suivantes seront effectuées automatiquement :

  1. byte → int (promotion de b)
  2. short → int (promotion de s)
  3. char → int (promotion de c, valeur 65)
  4. Addition des int : 10 + 20 + 65 + 30 = 125
  5. int → double (promotion du résultat final)

Résultat final : 125.0 (type double)

Question 3: Casting et perte d'information

Quel sera le résultat des opérations de casting suivantes?

double d = 123.456;
int i1 = (int) d;
int i2 = (int) Math.round(d);
byte b = (byte) 300;

Réponse :

  • i1 = 123 (troncature de la partie décimale)
  • i2 = 123 (arrondi mathématique, 123.456 → 123)
  • b = 44 (300 dépasse la capacité d'un byte, débordement : 300 - 256 = 44)

Question 4: Affichage formaté

Quelle sera la sortie du programme suivant?

int x = 10, y = 3;
double z = (double) x / y;
System.out.print("Résultat: ");
System.out.println(z);
System.out.printf("Valeur: %.2f%n", z);

Réponse :

Résultat: 3.3333333333333335
Valeur: 3.33

Explication :

  • Le cast (double) x convertit 10 en 10.0 avant la division
  • 10.0 / 3 donne un double avec une précision limitée
  • printf formate l'affichage avec 2 décimales

Question 5: Séquences d'échappement dans l'affichage

Qu'affichera cette instruction et pourquoi?

System.out.println("Ligne1\nLigne2\tTab\"Guillemets\\Backslash");

Réponse :

Ligne1
Ligne2 Tab"Guillemets\Backslash

Explication des séquences d'échappement :

  • \n : saut de ligne
  • \t : tabulation
  • \" : guillemet (évite la fin de chaîne)
  • \\ : backslash littéral

Question 6: Conversions et expressions constantes

Pourquoi ces déclarations sont-elles valides malgré l'absence de cast explicite?

byte b = 100;
short s = 1000;
char c = 50000;
int i = 10 * 20;

Réponse :

Java autorise les conversions restrictives implicites uniquement pour les expressions constantes lorsque :

  • La valeur est connue à la compilation
  • La valeur peut être représentée sans perte dans le type cible
  • 100 tient dans un byte (-128 à 127)
  • 1000 tient dans un short (-32768 à 32767)
  • 50000 tient dans un char (0 à 65535)
  • 10 * 20 = 200 (constante calculée à la compilation)

Question 7: Problèmes avec les flottants

Pourquoi ce code affiche-t-il "Pas égaux!" alors que mathématiquement 0.1 × 3 = 0.3?

double somme = 0.0;
for (int i = 0; i < 3; i++) {
    somme += 0.1;
}
if (somme == 0.3) {
    System.out.println("Égaux!");
} else {
    System.out.println("Pas égaux! somme = " + somme);
}

Réponse :

Problème de représentation binaire des nombres décimaux :

  • 0.1 ne peut pas être représenté exactement en binaire (comme 1/3 en décimal)
  • L'addition répétée accumule des erreurs d'arrondi
  • somme vaut environ 0.30000000000000004, pas exactement 0.3

Solution : Utiliser une comparaison avec tolérance :

if (Math.abs(somme - 0.3) < 0.0001) { ... }

Question 8: Conversions char et int

Qu'affichera ce programme et pourquoi?

char lettre = 'A';
int code1 = lettre;
int code2 = lettre + 1;
char suivante = (char) code2;
System.out.println("Code de A: " + code1);
System.out.println("Lettre suivante: " + suivante);

Réponse :

Code de A: 65
Lettre suivante: B

Explication :

  • 'A' a le code Unicode 65
  • Conversion automatique char → int
  • 65 + 1 = 66 (code de 'B')
  • Cast explicite int → char pour obtenir le caractère

Bonnes Pratiques

  • Utilisez des underscores dans les grands nombres pour améliorer la lisibilité
  • Préférez println avec concaténation pour un code plus lisible
  • Utilisez printf pour un affichage formaté précis
  • Évitez les comparaisons exactes (==) avec les nombres flottants
  • Utilisez des casts explicites uniquement lorsque nécessaire
  • Vérifiez les débordements possibles lors des conversions restrictives

Résumé

  • Java distingue float (32 bits) et double (64 bits) pour les nombres flottants
  • Les underscores améliorent la lisibilité des grands nombres (Java 7+)
  • System.out.print() et println() permettent l'affichage console
  • Les conversions peuvent être élargissantes (automatiques) ou restrictives (casting explicite)
  • Le casting peut entraîner une perte d'information (troncature, débordement)
  • Les nombres flottants sont des approximations, éviter les comparaisons exactes
 
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam