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 563
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    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.

  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 778
    Points
    5 778
    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 ?.

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 665
    Points
    5 665
    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.

  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 778
    Points
    5 778
    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 .

+ 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