joebar3333
Messages postés41Date d'inscriptiondimanche 24 octobre 2004StatutMembreDernière intervention29 juin 2005
-
5 mai 2005 à 10:45
joebar3333
Messages postés41Date d'inscriptiondimanche 24 octobre 2004StatutMembreDernière intervention29 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 !!
cs_Dobel
Messages postés333Date d'inscriptiondimanche 25 mai 2003StatutMembreDernière intervention23 novembre 20091 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]
joebar3333
Messages postés41Date d'inscriptiondimanche 24 octobre 2004StatutMembreDernière intervention29 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?