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 :

Problème de division


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut Problème de division
    Bonjour,

    Quelqu'un pourrait-il m'expliquer ce mystère ? :

    double result = 655.957;
    result /= 100;
    System.out.println(result);
    -> 6.55957

    result = 655.957;
    result /= 10;
    System.out.println(result);
    -> 65,5957

    result /= 10;
    System.out.println(result);
    -> 6.559569999999999

    Il y a des choses spécifiques à savoir concernant les divisions en Java ?

    Merci,
    Fred

  2. #2
    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
    Non,

    C'est normal !
    C'est dû à l'erreur réalisé lors du stockage de la valeur sur un système de valeur en base binaire+exposant en base binaire(puissance de 2).
    Ce qui implique des impressions de calcul.
    http://download.oracle.com/javase/tu...datatypes.html
    double: The double data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section 4.2.3 of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency.
    Cordialement,
    Patrick Kolodziejczyk.
    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.

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Il y a des choses spécifiques à savoir concernant les divisions en Java ?
    Concernant les nombres à virgules flottantes, en fait.
    Cela n'est pas spécifique à Java, c'est pareil en C, C++, C#, assembleur, Pascal, PHP, JavaScript, et je n'ai pas vérifié les autres.
    Cela n'est pas non plus spécifique à la division.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Concernant les nombres à virgules flottantes, en fait.
    Cela n'est pas spécifique à Java, c'est pareil en C, C++, C#, assembleur, Pascal, PHP, JavaScript, et je n'ai pas vérifié les autres.
    Cela n'est pas non plus spécifique à la division.
    Effectivement, je viens de faire un test en C et c'est pareil ( voir pire).


    Pour ce que je voulais faire, j'ai l'impression qu'en Java la bonne méthode est :
    BigDecimal euro = new BigDecimal(new BigInteger("655957"), 5);

    Merci à vous deux.

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Fred_34 Voir le message
    Pour ce que je voulais faire, j'ai l'impression qu'en Java la bonne méthode est :
    BigDecimal euro = new BigDecimal(new BigInteger("655957"), 5);
    Oui, enfin, pour faire de la monnaie, il suffit d'utiliser un long exprimé en centimes. (ou en centièmes de centimes, pour certains calculs.)
    Quand vient le moment d'afficher le montant en euros, tu poses une jolie virgule entre les troisième et deuxième derniers chiffres, et puis voilà.

    Et pour d'autres choses, au bout d'un moment, qu'est-ce qu'on s'en fout, d'une erreur de précision à la 15e décimale ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    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 482
    Par défaut
    Et encore c'est relatif. Je lisait un article une fois d'un gars qui bossait en banque. En "gros" pour eux la précision d'un double suffisait. Perdre du temps à utiliser des type précis (parce que ces type sont d'office plus longs à gérer et plus sujet à bug puis que leur manipulation est moins naturelle pour le programmeur) afin d'éviter au bout d'un milliard d'opération de perdre 10.000€ alors que la banque a un compte spécial pour ce genre de cas qui se chiffre en plusieurs millions d'euros, c'était peine perdue auprès des grandes pontes, il préfairaient un code en double facile à faire, facile à vérifier et donc la balance restait "en gros" correct.

    Il y a donc de l'avenir pour continuer à se faire verser les 0.005 euros de marge d'erreur sur son propre compte quand on programme chez eux

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

Discussions similaires

  1. Un problème de division
    Par chxlgs dans le forum Débuter
    Réponses: 3
    Dernier message: 27/02/2008, 12h28
  2. Problème de division
    Par luimême dans le forum Mathématiques
    Réponses: 4
    Dernier message: 04/05/2007, 17h41
  3. Problème de Division
    Par Dlyan dans le forum C++
    Réponses: 5
    Dernier message: 09/03/2006, 15h24
  4. problème de division par 100
    Par trent94 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 16/11/2005, 22h08
  5. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41

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