IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Primitifs et conversion


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut Primitifs et conversion
    Bonjour,
    Je profite de l'été pour travailler mes fondamentaux java. Aujourd'hui je bute sur la notion de conversion. J'ai bien compris qu'un type possédant une allocation mémoire plus petite qu'un autre type pourra être converti selon le principe de la conversion implicite. (byte->short->int->long).
    Mais :
    Quand je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float f =44.88f;
    	 double d = f;
     
    		System.out.println(f);
    		System.out.println(d);
    je sors respectivement ceci sur la sortie standard.
    44.88
    44.880001068115234
    Je ne comprend pas la dernière valeur double d.

    Vous remerciant

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Hello,

    eh ben, c'est du float et du double, les nombres en virgule flottante. Tu as probablement entendu dire que ces nombres traités par des ordinateurs ne font que du calcul approché. En tout cas c'est censé être évident : supposons que tu leur demandes de calculer 1 divisé par 3. On a tous appris à l'école que ça fait 0.33333... et que les 3 après la virgule flottante ne s'arrête jamais. float et double ne prenant que 32 et 64 bits de mémoire, il n'est pas possible pour eux de stocker une infinité de 3. Et pourtant si tu leur demandes de calculer 1 divisé par 3 eh ben il refuse pas. Il te fait un calcul quand même. Et le résultat, ben c'est pas 1/3 mais c'est pas très loin de la valeur réelle de 1/3. C'est un calcul approché.

    Tous les calculs faits avec float ou double sont approchés. Quand ça tombe pile, c'est plus un hasard qu'autre chose.

    Donc voilà, les résultats que tu obtiens, convertir 44.88 en 44.880001068115234, eh ben ça fait pas une grosse différence donc voilà, rien d'aberrant. Si tu voulais des nombres exacts il fallait pas utiliser ni float ni double.

    Normalement tu devrais pas chercher plus loin que ça.

    Mais si tu veux quand même l'explication technique, allons-y :

    44.88 est un nombre qui ne peut pas être représenté sous forme de virgule flottante pour ordinateur. En effet nous rappellerons que les ordinateurs codent en binaire, et si on essaie d'écrire 44.88 en base 2, eh bien c'est impossible. En effet 44.88 c'est 4488/100 c'est à dire 1122/25 donc 1122/(5*5), bon courage pour faire des cinquièmes en base 2.

    Donc ben puisque c'est pas possible, qu'est-ce qui se passe, le compilateur calcule une valeur approchée de 44.88 mais qui, elle, peut être stockée dans un float. Et c'est cette valeur-là qui est mise dans la variable f. La valeur calculée est la plus proche de 44.88, qui puisse être stockée dans un float.

    En l'occurrence, f se voit affecter la valeur réelle, 44.880001068115234375

    Du coup, pourquoi System.out.println(f); affiche 44.88 ?

    Parce que ce n'est pas intéressant d'afficher autant de chiffres après la virgule. De toute façon les flottants se traînent toujours des chiffres bidons après plusieurs zéros.
    Quand Java essaie de convertir automatiquement un flottant en représentation texte, il n'affiche qu'un nombre limité de chiffres après la virgule. Précisément, il en affiche autant qu'il est nécessaire, pour montrer la différence avec les autres valeurs proches que les flottants peuvent possiblement avoir.

    44.880001068115234375 est la valeur flottante la plus proche de 44.88 qu'on puisse avoir. Donc il suffit d'afficher 44.88 pour montrer la différence avec les autres valeurs flottantes proches de 44.880001068115234375.

    Du coup, pourquoi System.out.println(d); affiche 44.880001068115234 ?

    Eh ben parce que les double sont beaucoup plus précis que les float. Il existe beaucoup de valeurs flottantes double proches de 44.880001068115234375. Il faut afficher bien plus de chiffres qu'en float, pour distinguer des autres valeurs proches.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Merci pour l'explication (technique), probablement la réponse la plus complète que j'ai jamais reçue avec celles de Joël.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion de tableau de byte en types primitifs
    Par soft0613 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 14/03/2008, 15h14
  2. Conversion de size_t en type primitif
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 24/02/2008, 19h55
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo