Questions de débutant

Résolu
joebar3333 Messages postés 41 Date d'inscription dimanche 24 octobre 2004 Statut Membre Dernière intervention 29 juin 2005 - 5 mai 2005 à 10:45
joebar3333 Messages postés 41 Date d'inscription dimanche 24 octobre 2004 Statut Membre Dernière intervention 29 juin 2005 - 6 mai 2005 à 09:35
Salut à tous,

j'ai quelques questions de débutant java.
Premièrement, je voudrais savoir pourquoi on est obligé de caster les opérandes d'une division afin d'avoir un résultat à virgule. Par exemple :float res 84 / 10 ---> res 8.0float res (float)84 / (float)10 ---> res 8.4
Moi qui vient du C++ on n'est absiluement pas obligé de faire ça.

Deuxiement, la c'est un peu plus louche.
float res = (float)84/(float)10;
for(int i=0;i<10;i++)
{
System.out.println(res * i);
}
Jusque la rien de sorcier. En bon pigeon j'étais sur que cette simple boucle me donnerait comme résultat : 0.0 - 8.4 - 16.8 - ... - 84.
Or pas du tout. Voici les résulats que j'obtiens:
0.0
8.4
16.8
25.199999
33.6
42.0
50.399998
58.799995
67.2
75.6

J'ai une perte de donnée sur l'incrément, qui normalement est à 8.4. A partir de i=3, l'incrément passe de 8.4 à 8.3333 ....... C'est incompréhensible.

La même boucle avec une petit changement de type.
double res = (double)84/(float)10;
for(int i=0;i<10;i++)
{
System.out.println(res * i);
}

la encore une erreur. Les résultats sont :
0.0
8.4
16.8
25.200000000000003
33.6
42.0
50.400000000000006
58.800000000000004
67.2
75.60000000000001

Bref je capte rien . Si quelqu'un pouvait m'expliquer ma faille, je serai très sympa !!

Merci d'avoir lu mon post.

2 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
6 mai 2005 à 01:43
Bonsoir (enfin, bonne nuit vue l'heure...)



Pour ta première question :



lorsque tu fais float res = 84/10;

l'opérateur / correspond à la division d'entier

il retourne donc 8, qui est casté en float pour être enregistré dans
res. Il suffit que l'un des 2 nombres soit floatant pour résoudre le
problème.

par exemple, float res = 84./10;





Pour la 2ème question, je cite un site :)



Decimal-Binary Conversion



The computer represents numbers in base 2. This can result in
loss of precision since often a binary fraction cannot exactly
represent a given finite decimal fraction (0.1 for example).
All finite binary fractions, however, can be converted to finite
decimal fractions.



La représentation binaire d'un rationnel fini n'est pas nécessairement finie !

(de tête, 0.1 donnerait en binaire 0.0001100110011....)



2 solutions :

- arrondir (méthode dans la classe Math)

- utiliser la classe BigDecimal



Bonne prog !



Dobel
[Une fois rien, c'est rien; deux fois rien, ce
n'est pas beaucoup, mais pour trois fois rien, on peut déjà s'acheter
quelque chose, et pour pas cher]
3
joebar3333 Messages postés 41 Date d'inscription dimanche 24 octobre 2004 Statut Membre Dernière intervention 29 juin 2005
6 mai 2005 à 09:35
Salut,

Merci pour ta réponse. Pour la 1ere question, j'ai bien capté pas de pb.
Pour l'explication de la perte de précision, je trouve ça toujours bizarre mais bon.
Réponse acceptée?

Merci
0
Rejoignez-nous