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 :

Erreur de calcul


Sujet :

avec Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut Erreur de calcul
    Bonjour,

    Mon programme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class CompteBancaire 
    {
     public String nom, prenom, adresse,tel;
     
     public CompteBancaire()
     {
        System.out.println("Vous allez créer un compte :"); 
        System.out.println("Entrez le nom du titulaire :");
        this.nom=Lire.chaine();
        System.out.println("\nEntrez le prenom titulaire :");
        this.prenom=Lire.chaine();
        System.out.println("\nEntrez l'adresse du titulaire :");
        this .adresse=Lire.chaine();
     }
      public void afficherAdresse()
      {
        System.out.println("\nAdresse du compte de " + this.nom + " = " + this.adresse );
      }
    }
     
    public class CompteEpargne2 extends CompteBancaire 
    {
        public final double soldeMinimal=1;
        public double tauxInteret=3/100;
     
        public double montantApresInteret(double montantInitial)
        {
            return montantInitial*(1+tauxInteret);
     
        }
    }
     
    public class TesterHeritage2 
    {
        public static void main(String[] args)
        {
            CompteEpargne2 c2=new CompteEpargne2();
            double sommeVersées=2524;
            System.out.println("\nSolde après un an : "+c2.montantApresInteret(sommeVersées)); 
        }
     
    }
    affiche ceci :

    Vous allez créer un compte :
    Entrez le nom du titulaire :
    x
    Entrez le prenom titulaire :
    y
    Entrez l'adresse du titulaire :
    z
    solde après un an : 2524.0
    Normalement après avoir calculé, je dois avoir un solde de : 2599.72
    mais j'obtiens 2524.0

    Dans la classe CompteEpargne2, si je corrige et qu'au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public double tauxInteret=3/100;
    je mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public double tauxInteret=0.03;
    Mon résultat est bon :
    2599.7200000000003

    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Parce que 3/100 ca fait 0.0 (car tu utilises des entiers...)

    Et que ton chiffre + 0 ca fait ton chiffre de départ.

    Enfin rien qu'un coup de debug aurait put te faire trouver par toi même...
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Points : 645
    Points
    645
    Par défaut
    Pour éviter ce souci de la division entière, tu peux déclarer ton taux comme ceci : 3.0/100. Ou encore 0.03, et c'est réglé.

    Toujours faire attention lors d'une division. Si les 2 opérandes sont entiers alors il s'agit de la division entière.
    Je sais que désormais vivre est un calembour,
    La mort est devenue un état permanent,
    Le monde est aux fantômes, aux hyènes et aux vautours.
    Moi je vous dis bravo et vive la mort.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 684
    Points : 147
    Points
    147
    Par défaut
    merci beaucoup j'ai compris

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par domxaline Voir le message
    Mon résultat est bon :
    2599.7200000000003
    mouais la définition de "bon" est vraiment pas la même pour toi que pour moi... faire des calculs de montant monétaires avec des doubles, c'est prendre un très gros risque quand même, du fait qu'on ne peut pas représenter correctement toute une série de valeur, et que le delta peut vraiment devenir énorme si on cumule les opérations... Et plus la valeur augmente, plus le risque d'imprécision augmente aussi...

    2 options nettement meilleures:
    - utiliser des nombres entiers (et on stocke des valeurs représentant des centimes, ou des dixièmes de centimes, ou des centièmes de centimes 'fin bref on prend la résolution qui convient au niveau de précision demandé)
    - utiliser BigDecimal pour tous les calculs (c'est plus lent mais plus précis): on continue de stocker des doubles où ça convient, mais toutes les opérations passent dans un BigDecimal.

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

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

Discussions similaires

  1. [2.0] Erreur de calcul numérique de .net o_O
    Par Smeuuh dans le forum Framework .NET
    Réponses: 8
    Dernier message: 11/11/2006, 17h04
  2. [Tableaux] erreur de calcul
    Par dleu dans le forum Langage
    Réponses: 18
    Dernier message: 08/12/2005, 13h28
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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