[java] mon prg donne une erreur de calcul

domxaline -  
issemgane Messages postés 32 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

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));
}

}

quant à output:
me donne
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

mais dans la classe CompteEpargne2
si je corrige au lieu de:
public double tauxInteret=3/100;
si j'écris ainsi
public double tauxInteret=0.03;

mon résultat est bonne:
2599.7200000000003

veuillez m'aider svp

normalement après avoir calculé je dois avoir solde après avoir un an: 2599.72
mais pourquoi j'ai 2524.0 ?
veuillez m'aidez svp
A voir également:

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

C'est parce que tu penses que 3/100 donne 0.03, or cela fait 0 puisque 3 est un entier.
0
MasterMbg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,
dans la classe
remplace
public double tauxInteret=3/100;
par :
public double tauxInteret=(double)3/100;

Ceci t'évitera la division entière...
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le cast en double c'est moche :-)

Il vaut mieux écrire
3.0/100.0
pour indiquer explicitement que ce sont des double.
0
MasterMbg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
Peux-tu expliquer en quoi est-ce moche? ou bien qui à toi de voir si tu as un problème avec le "transtipage"... Sinon, pas mal ton idée sauf que je trouve pas important de transformer aussi le dénominateur en double (100.0) car la transformation du numérateur suffirait (le résultat d'une opération entre un double et un int est double).
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > MasterMbg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
C'est "moche" parce que cela signifie que tu créés d'abord un int, puis tu effectues une conversion en double. Ça fait donc deux étapes. C'est plus propre de créer directement un double.
Sur le même principe, une division d'un double par un int conduit à convertir le int en double, alors qu'on pourrait directement donner le dénominateur en double et ainsi s'éviter la conversion.
0
MasterMbg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
Et au cas où les données ne seraient pas pas saisies en dure? penses tu que ce principe tiendrait-il le coup?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > MasterMbg Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Ce serait même pire. Ici, puisque les valeurs sont en dures il est possible que le résultat soit calculé directement à la compilation. Mais si c'était dans une boucle par exemple, donc à l'exécution, tu aurais à chaque fois la conversion, donc ça prendrait à chaque fois un petit peu plus de temps, certes pas beaucoup plus, mais autant faire ça proprement et éviter les conversions inutiles.
0
issemgane Messages postés 32 Date d'inscription   Statut Membre Dernière intervention   5
 
Salut, je pense que vous devez faire un cast pour la variable tauxInteret , donc vous avez deux solutions :
1 : passer par un cast : public double tauxInteret=(double) 3/100;
2 : indiquer que les deux nombre sont double, ce qui donne : public double tauxInteret=3.0/100.0;
bonne chance..
0