OVH Cloud OVH Cloud

Erreur de calcul

5 réponses
Avatar
Xavier
Petit bout de code :

double a = 40;
double b = 39.99;
System.out.println(a);
System.out.println(b);
System.out.println("a - b = "+(a - b));
System.out.println("a + b = "+(a + b));

Résultat attendu :

40.0
39.99
a - b = 0.01
a + b = 79.99

Résultat obtenu (java 1.3.1_04-b02 et 1.4.2_09-b05) :

40.0
39.99
a - b = 0.00999999999999801
a + b = 79.99000000000001

Etrange !!

Une idée ?

Xavier

5 réponses

Avatar
Fabien Bergeret
Xavier wrote:
Petit bout de code :

double a = 40;
double b = 39.99;
System.out.println(a);
System.out.println(b);
System.out.println("a - b = "+(a - b));
System.out.println("a + b = "+(a + b));

Résultat attendu :

40.0
39.99
a - b = 0.01
a + b = 79.99

Résultat obtenu (java 1.3.1_04-b02 et 1.4.2_09-b05) :

40.0
39.99
a - b = 0.00999999999999801
a + b = 79.99000000000001

Etrange !!

Une idée ?

Xavier


Oui, les calculs en flottant sont TOUJOURS des approximations.

Utiliser la classe BigDecimal a la place.

Avatar
Xavier
Oui, les calculs en flottant sont TOUJOURS des approximations.
Utiliser la classe BigDecimal a la place.


Merci

Avatar
Francis JUGE-BOIRARD
Bonjour,
Ok pour les approximation mais je dois reconnaitre que j'aimerais comprendre
pourquoi. Il me semble que le codage d'un flottant en est la cause.... Est-ce
que quelqu'un aurait l'adresse d'un article ou d'un cours qui tiens la route sur
le sujet ????
Avatar
rp
Bonjour,
Ok pour les approximation mais je dois reconnaitre que j'aimerais comprendre
pourquoi. Il me semble que le codage d'un flottant en est la cause.... Est-ce
que quelqu'un aurait l'adresse d'un article ou d'un cours qui tiens la route
sur le sujet ????


http://www.commentcamarche.net/base/representation.php3
http://ariffart.club.fr/boutils/boutils05.html


--
Romain PETIT
http://cerbermail.com/?O16kfXOFcq
(cliquez sur le lien ci-dessus pour me contacter en privé)

Avatar
Jacques-Olivier Haenni
Bonjour,

En gros, le problème est dû au fait que certains nombres que l'on peut
exactement représenter en base 10 avec un nombre de décimales fini ne
peuvent pas être codés exactement en base 2 avec un nombre de décimales
fini. En effet, il y a certains nombres que l'on ne peut pas
représenter exactement en base 2 avec un nombre fini de chiffres.

Par analogie, il y a également des nombres que l'on ne peut pas
réprésenter exactement en base 10 avec un nombre fini de chiffres.
Exemple: 1/3; si on le code sur 3 décimales, ça donne 0.333 qui n'est
qu'une approximation.

Pour poursuivre l'analogie, si je vais un le calcul 1/3 + 1/3 + 1/3 en
base dix avec 3 décimales, ça donne: 0.333 + 0.333 + 0.333 = 0.999 alors
que l'on aurait pu attendre 1.

C'est exactement le même problème avec les float/double en
informatique. Mais comme ça se passe en base 2 et non 10, il est
difficile pour l'humain de voir ce qui se passe...

On a d'ailleurs également un problème analogue avec les calculatrices de
poches...

Il ne s'agit donc pas à proprement parler d'approximation lors du
calcul, mais plutôt de limitations imposées par la représentations des
nombres.

C'est pourquoi, en Java, pour des calculs financiers par exemple, il est
fortement conseiller d'utiliser des BigDecimal plutôt que des double,
alors que pour d'autres applications telles que des simulations ou du
rendu de scène 3D, l'utilisation de double est généralement suffisante.
L'utilisation de BigDecimal par rapport à des double est évidemment
pénalisante en terme de performances.

Jacques-Olivier


Francis JUGE-BOIRARD wrote:

Bonjour,
Ok pour les approximation mais je dois reconnaitre que j'aimerais
comprendre pourquoi. Il me semble que le codage d'un flottant en est
la cause.... Est-ce que quelqu'un aurait l'adresse d'un article ou
d'un cours qui tiens la route sur le sujet ????