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

Langage Java Discussion :

Résultat anormal lors de calcul Double


Sujet :

Langage Java

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Résultat anormal lors de calcul Double
    Coucou tout le monde,

    Juste une petite question :
    Est-ce normal que lorsqu'on fait :
    double test;
    test = 578 * 0.001; //Pour faire une division par 1000
    J'obtient le résultat 0.578 (ce qui est tout à fait normal
    Mais lorsque je fais 565 ou 563 :
    test = 565 * 0.001;
    J'obtient le résultat : 0.5650000000000001

    Je pense qu'il est possible d'arrondir après x chiffre apres la virgule.
    Comment on fait ?

    Voilà, si quelqu'un pouvait m'apporté plus d'information sur "double"

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    C'est normal les calculs sur les types natifs apportent des imprécisions. Pour les calculs avec plus de pérécision, utiliser BigDecimal ou BigInteger.

    A+

  3. #3
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par thibaut
    C'est normal les calculs sur les types natifs apportent des imprécisions. Pour les calculs avec plus de pérécision, utiliser BigDecimal ou BigInteger.

    A+
    Oui, enfin, pas toujours... D'avoir une erreur de 10^-16 n'est pas forcément génant... D'autant que dans ce cas, BigDecimal apporterait plus de précision, mais pas une précision infinie car ça ne tombe pas juste, quelque soit le nombre de chiffres après la virgule...

    Pour que ça ne gêne pas l'affichage, quand tu affiches un double, passe par DecimalFormat.

  4. #4
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Le DecimalFormat seul n'est pas la bonne solution.

    Il faut arrondir et tronquer le résultat.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par thibaut
    Le DecimalFormat seul n'est pas la bonne solution.

    Il faut arrondir et tronquer le résultat.
    Dans ce cas là, comment fait-on pour arrondir ?

    D'autre part, une division par 1000 et donne en général un résultat précis.. (ce n'est pas comme si je diviser par 3...)

    Cela permet juste de décallé le virgule

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par totore
    D'autre part, une division par 1000 et donne en général un résultat précis.. (ce n'est pas comme si je diviser par 3...)

    Cela permet juste de décallé le virgule
    Ce que tu dis est vrai uniquement dans la base dans laquelle tu travailles...

    En base 10, tu divises par 10^3 (1000) ça ne fait que décaler la virgule...
    L'ordinateur travaille en base 2, et donc c'est quand tu divises par 2^3 que ça ne fait que décaler la virgule (bien sûr ça marche avec toutes les puissances, 2^4, 2^5, 2^-12...).

    Or, en base 2, 1/10 (0.1) ça ne tombe pas juste, d'où les erreurs

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 14
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par ®om
    Ce que tu dis est vrai uniquement dans la base dans laquelle tu travailles...

    En base 10, tu divises par 10^3 (1000) ça ne fait que décaler la virgule...
    L'ordinateur travaille en base 2, et donc c'est quand tu divises par 2^3 que ça ne fait que décaler la virgule (bien sûr ça marche avec toutes les puissances, 2^4, 2^5, 2^-12...).

    Or, en base 2, 1/10 (0.1) ça ne tombe pas juste, d'où les erreurs
    Arf... en gros, si je t'ai bien compris, c'est parce que java fonctionne en binaire... et que mon résultat en base 10 est converti en base 2 pour effectuer les calcules et reconverti en base 10 ensuite ?

    Vive java....

  8. #8
    Membre confirmé Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Points : 474
    Points
    474
    Par défaut
    Citation Envoyé par totore
    Arf... en gros, si je t'ai bien compris, c'est parce que java fonctionne en binaire... et que mon résultat en base 10 est converti en base 2 pour effectuer les calcules et reconverti en base 10 ensuite ?

    Vive java....
    En informatique, tout est binaire. Il n'y a pas que Java ! Ton nombre est stocké en mémoire sous forme de 0 et de 1, quelque soit le langage que tu utilises.
    Imagine que tu as une variable var entière qui vaut 2. En mémoire, elle est stockée sous la forme de 0010. Quand tu fais var * 2, il y a un simple décalage des bits en mémoire : tu obtiens 0100. Maintenant, quand tu fais une multiplication ou une division par autre chose qu'une puissance de 2, ça devient tout de suite beaucoup + compliqué, surtout pour les nombres décimaux.
    Un nombre étant codé sur un nombre fini de bits, il se peut qu'il y ai "perte d'information" (troncage) lors d'une division. La preuve quand tu affiches 1/3, il n'y a pas des 333333 à l'infini.

  9. #9
    Membre confirmé Avatar de broumbroum
    Profil pro
    Inscrit en
    Août 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2006
    Messages : 406
    Points : 465
    Points
    465
    Par défaut
    ce doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Formatter().format("%1$0-3", leNombreDouble)
    à vérifier...

Discussions similaires

  1. Résultat dynamique d'un calcul
    Par nineosoe dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 20/06/2007, 15h42
  2. [C] Récupérer un résultat de fonction de type double
    Par EnigmuS dans le forum x86 32-bits / 64-bits
    Réponses: 10
    Dernier message: 23/04/2007, 10h17
  3. Réponses: 1
    Dernier message: 13/11/2006, 18h37
  4. résultat anormal d'une requete
    Par Dafbau dans le forum Access
    Réponses: 2
    Dernier message: 06/10/2006, 19h22
  5. Réponses: 1
    Dernier message: 07/02/2006, 12h52

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