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

Java Discussion :

problème avec le type double


Sujet :

Java

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut problème avec le type double
    Je sais que le comportement qui suit est un vieux problème, mais je ne comprends pas pourquoi un tel simple morceau de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double val = 0;
    for(int i=0;i<10;i++) {
        val+=0.1;
        System.out.println(val);
    }
    me donne-t-il cette résultat
    0.1
    0.2
    0.30000000000000004
    0.4
    0.5
    0.6
    0.7
    0.7999999999999999
    0.8999999999999999
    0.9999999999999999
    ???

    et comment faire pour éviter ce problème

    Merci...

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    Tu ne peux pas faire de calcul de précision avec le type primitif double. C'est une optimisation de Java qui privilégie la vitesse de calcul à la précision.
    Tu peux résoudre le problème en utilisant la classe BigDecimal.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par mick8569 Voir le message
    Tu ne peux pas faire de calcul de précision avec le type primitif double. C'est une optimisation de Java qui privilégie la vitesse de calcul à la précision.
    Ce n'est pas une optimisation de Java, c'est ainsi que fonctionnent les nombres flottants, dans n'importe quel langage utilisant les nombres flottants.

    Mais effectivement, les nombres flottants n'ont pas une précision suffisante pour éviter ces petits écarts.
    BigDecimal est une solution, oui. Pour le cas présent, une autre solution serait de travailler sur des int, et d'afficher un zéro et une virgule devant, à l'affichage. En gros, de diviser par 10 pour rétablir la décimale, à l'affichage, pas pendant les calculs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    L'utilisation de la classe BigDecimal doit être bien justifiée. En effet, les opérations sur les BigDecimal sont assez coûteuses en terme de performance.
    Aussi, à moins d'avoir un besoin indispensable d'une précision absolue (où dans ce cas effectivement il faut utiliser les BigDecimals) il est plus judicieux de travailler avec des floats/doubles et d'utiliser un DecimalFormat pour l'affichage Comment convertir un nombre en chaîne formatée ?.
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gia,
    Citation Envoyé par le y@m's Voir le message
    L'utilisation de la classe BigDecimal doit être bien justifiée. En effet, les opérations sur les BigDecimal sont assez coûteuses en terme de performance.
    Aussi, à moins d'avoir un besoin indispensable d'une précision absolue (où dans ce cas effectivement il faut utiliser les BigDecimals) il est plus judicieux de travailler avec des floats/doubles et d'utiliser un DecimalFormat pour l'affichage Comment convertir un nombre en chaîne formatée ?.
    Cette "précision absolue" n'existe pas pour les nombres réels, on finit toujours par atteindre une limite.
    Si les cons volaient, il ferait nuit à midi.

  6. #6
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie pour toutes vos réponses si rapides et si claires

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gia,

    Cette "précision absolue" n'existe pas pour les nombres réels, on finit toujours par atteindre une limite.
    Je parlais de précision des calculs, de l'epsilon qui est parfois introduit lors de la manipulation des nombres flottants, pas de la précision en terme de nombre de décimal .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

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

Discussions similaires

  1. problème d'overflow avec variable type double
    Par ben83 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 15/02/2007, 09h55
  2. Problème avec le type BLOB dans oracle
    Par pguedia dans le forum Oracle
    Réponses: 1
    Dernier message: 10/11/2005, 17h33
  3. problème avec le type timestamp
    Par aline dans le forum Oracle
    Réponses: 6
    Dernier message: 21/02/2005, 10h05
  4. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  5. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48

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