[JAVA] 5.3-5.2= ??

5.3-5.2= ?? [JAVA] - Java - Programmation

Marsh Posté le 06-01-2004 à 19:26:29    

Code :
  1. public class Test {
  2.     public static void main(String[] panthere) {
  3.         double a = 5.3;
  4.         double b = 5.2;
  5.         double d = a-b;
  6.         System.out.println(new Double(d).toString());
  7.     }
  8. }


[noldor@mithrandil ~/test]$ java Test
0.09999999999999964
 
J'ai loupé un épisode ou quoi ?
Je suis en train de développer une calculatrice, et ce genre de chose me gêne beaucoup. Peut-on l'éviter ?
 

Reply

Marsh Posté le 06-01-2004 à 19:26:29   

Reply

Marsh Posté le 06-01-2004 à 19:37:51    

y a un topic concernant ce problème :  
http://forum.hardware.fr/hardwaref [...] -40339.htm
 
bonne lecture ! ;)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-01-2004 à 19:40:41    

La conclusion c'est que un calcul en flottant ne sera jamais juste. C'est dû au fait que les flotant sont sauvegardé en base 2 et pas en abse 10 =>  5.3 pour toi c'est unn nombre juste, mais en base 2, il n'y a pas de repésentation juste possible => ca devient une approximation.
 
Conclusion, tu dois choisir un niveau de précision et t'en tenir à ce niveau là.
 
Autre solution, utiliser la classe BigDecimal avec son constructeur sous forme de chaine de caractère


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-01-2004 à 19:41:10    

merci beaucoup
je me doutais bien que ça venait de la façon dont les doubles sont stockés, mais là j'ai quand même été surpris !!
 
EDIT : en fait, l'un de mes 2 neurones a oublié qu'en info on bosse en base 2


Message édité par noldor le 06-01-2004 à 19:43:06
Reply

Marsh Posté le 06-01-2004 à 19:42:46    

noldor a écrit :

merci beaucoup
je me doutais bien que ça venait de la façon dont les doubles sont stockés, mais là j'ai quand même été surpris !!


si tu utilises un DecimalFormat avec quelques chiffres après la virgule pour afficher ton double, tu veras que tu obtiendras l'affichage auquel tu t'attendais


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 06-01-2004 à 19:43:29    

benou a écrit :


si tu utilises un DecimalFormat avec quelques chiffres après la virgule pour afficher ton double, tu veras que tu obtiendras l'affichage auquel tu t'attendais

c'est la solution que je vais adopter en effet
encore merci !

Reply

Marsh Posté le 06-01-2004 à 19:48:33    

Code :
  1. System.out.println(new Double(d).toString());


 
ca a un interet de faire ca au lieu d'un bete println(d) ?
 
 

Reply

Marsh Posté le 06-01-2004 à 19:54:24    

chrisbk a écrit :

Code :
  1. System.out.println(new Double(d).toString());


 
ca a un interet de faire ca au lieu d'un bete println(d) ?
 
 
 

non  [:icon12]


Message édité par the real moins moins le 06-01-2004 à 19:54:42

---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-01-2004 à 20:18:47    

en effet, c'est parce que j'ai fait un copier/coller/adapter d'un morceau de code où j'avais besoin d'un String

Reply

Marsh Posté le 06-01-2004 à 20:26:33    

noldor a écrit :

en effet, c'est parce que j'ai fait un copier/coller/adapter d'un morceau de code où j'avais besoin d'un String

Double.toString(d) ;)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-01-2004 à 20:26:33   

Reply

Marsh Posté le 06-01-2004 à 20:27:10    

tain il est chelou le source de cette methode :heink:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-01-2004 à 20:32:53    

the real moins moins a écrit :

tain il est chelou le source de cette methode :heink:


ouep :/

Reply

Marsh Posté le 06-01-2004 à 20:33:41    

c'est pareil pour Float tiens


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 06-01-2004 à 20:34:05    

tiens, comique le code de Integer.toString(i)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed