[java] mon prg donne une erreur de calcul

Fermé
domxaline - Modifié par domxaline le 8/12/2014 à 13:34
issemgane Messages postés 32 Date d'inscription lundi 15 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014 - 15 déc. 2014 à 14:22
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
8 déc. 2014 à 18:35
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 lundi 26 novembre 2012 Statut Membre Dernière intervention 12 mars 2015
Modifié par MasterMbg le 11/12/2014 à 15:19
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
11 déc. 2014 à 16:14
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 lundi 26 novembre 2012 Statut Membre Dernière intervention 12 mars 2015 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
11 déc. 2014 à 16:23
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > MasterMbg Messages postés 7 Date d'inscription lundi 26 novembre 2012 Statut Membre Dernière intervention 12 mars 2015
11 déc. 2014 à 16:40
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 lundi 26 novembre 2012 Statut Membre Dernière intervention 12 mars 2015 > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
11 déc. 2014 à 16:50
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > MasterMbg Messages postés 7 Date d'inscription lundi 26 novembre 2012 Statut Membre Dernière intervention 12 mars 2015
11 déc. 2014 à 17:20
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 lundi 15 décembre 2014 Statut Membre Dernière intervention 23 décembre 2014 5
15 déc. 2014 à 14:22
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