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 :

Chiffres après la virgule 0.799999999


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut Chiffres après la virgule 0.799999999
    bonjour, j'ai voulu faire un petit code pour affichier les chiffres de 0.1 à 1

    j'ai donc décidé de faire une boucle for avec un itérateur que je déclare en double car je veux l'incrémenter à chaque fois de 0.1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ( double i = 0.1; i <= 1.0 ; i += 0.1 )
    	{System.out.println( i );}
    Le résultat:
    0.1
    0.2
    0.3000000000004
    0.4
    0.5
    0.6
    0.7
    0.799999999999
    0.899999999999
    0.999999999999

    Pourquoi il y -t'il tous ces chiffres après la virgule et pourquoi je n'ai pas un chiffre rond ? Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par JB122 Voir le message
    bonjour, j'ai voulu faire un petit code pour affichier les chiffres de 0.1 à 1
    Les... chiffres de 0.1 à 1 ...
    Ça n'existe pas...

    Mais bon, je suppose que tu veux dire 0.1 puis 0.2 puis 0.3 et ainsi de suite jusqu'à 0.9

    Citation Envoyé par JB122 Voir le message
    Pourquoi il y -t'il tous ces chiffres après la virgule et pourquoi je n'ai pas un chiffre rond ?
    Les calculs en virgule flottantes sont toujours approchés, pas exacts.
    Du coup, en accumulant les approchés en suites d'additions, de temps en temps on tombe sur des cas où l'affichage lui-même est inexact.

    Un peu de lecture sur le sujet dans la FAQ.

    Dans le monde réel c'est rarement un problème : on a pas souvent envie d'additionner 0.1 à répétition, et puis on peut afficher des arrondis au lieu de compter sur la politique d'affichage de System.out.println(). Et si vraiment on a besoin de calculs exacts il y a des solutions autre que les flottants : BigDecimal ou bien juste des long qui représentent un nombre de dixièmes au lieu d'unités, et dont on gère la virgule à l'affichage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Les double ne sont pas stocké sous forme décimal. Comme les float ce sont des nombre flottant.
    Documentation java expliquant le type primitif :
    http://docs.oracle.com/javase/tutori...datatypes.html
    Il existe un site qui explique la problématique ici :
    http://floating-point-gui.de/basic/
    Ou sur wikipédia :
    http://en.wikipedia.org/wiki/Double-...g-point_format

    Il est possible d'afficher un double en donnant une précision avec la classe DecimalFormat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DecimalFormat df = new DecimalFormat("#.##");
    df.format(0.912385);
    Qui affichera :
    0.91
    Tu trouvera plus d'infomation sur DecimalFormal ici :
    http://docs.oracle.com/javase/7/docs...malFormat.html

    Si tu as une problématique de calcule lié à la représentation décimal, alors il est préférable d'utilisé des BigDecimal :
    http://docs.oracle.com/javase/7/docs...igDecimal.html
    (Attention de bien lire la documentation avant d'utiliser ! )

    Cordialement,
    Patrick Kolodziejcyzk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    Je rajoute une tartine. 0.1 ne peux pas être exprimé sous forme finie de puissances de 1/2. En effet, sa valeur en base 2 est

    0.000110011001100110011001100110011001100110011001100110011001.......

    Donc la valeur en mémoire est forcément tronquée car on n'a pas une infinité de mémoire, donc tes sommes accumulent les erreurs.

    Ton code devrait être, pour éviter les erreurs accumulées:

    for ( double i = 1; i <= 10.0 ; i += 1 )
    {System.out.println( i /10.0);}

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 63
    Par défaut
    Merci à tous pour vos explications.
    C'est plus clair maintenant.

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

Discussions similaires

  1. arrondir un nombre à 2 chiffres après la virgule
    Par El Saigneur dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/02/2005, 09h36
  2. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 19h28
  3. Chiffres après la virgule figés
    Par bondjames dans le forum Bases de données
    Réponses: 6
    Dernier message: 11/03/2004, 00h09
  4. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 14h04
  5. Nb de chiffres après la virgule ?
    Par Thcan dans le forum C
    Réponses: 10
    Dernier message: 17/09/2003, 22h49

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