[java] problème avec la précision des nombres réels

problème avec la précision des nombres réels [java] - Java - Programmation

Marsh Posté le 26-04-2004 à 20:26:36    

:hello:  salut tlm ;)
 
on cherche à faire une multiplication par 100 d'un nombre réel de manière juste  :whistle:  
 
or
 

Code :
  1. double montant = 2156.24;
  2. Double montantD = new Double(montant*100);
  3. BigDecimal montantBD = new BigDecimal(montant*100);
  4. Float montantF = new Float(montant*100);
  5. System.out.println(montantD);
  6. System.out.println(montantBD);
  7. System.out.println(montantF);


 
me donne respectivement
215623.99999999997
215623.99999999997089616954326629638671875
215624.0
 
je me dis chouette j'utilise le type Float mais çà se corse
 

Code :
  1. Double montant = 900000.22;
  2. Float montantD = new Double(montant*100);
  3. BigDecimal montantBD = new BigDecimal(montant*100);
  4. Float montantF = new Float(montant*100);
  5. System.out.println(montantD);
  6. System.out.println(montantBD);
  7. System.out.println(montantF);


 
me donne respectivement
9.0000022E7
90000022
9.0000024E7
 
donc dans ce cas ci c'est le Double et le BigDecimal qui me donne un résultat juste :/
 
Comment que je fais pour que cela fonctionne dans tous les cas  :??:  
Quelqu'un saurait m'expliquer et me donner une piste ? car pour l'instant je sèche dans mes recherches :/


Message édité par m@nou le 26-04-2004 à 20:34:33
Reply

Marsh Posté le 26-04-2004 à 20:26:36   

Reply

Marsh Posté le 26-04-2004 à 20:39:22    

double est plus précis que float, tu as un meilleur résultat, c'est normal.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-04-2004 à 20:43:28    

nraynaud a écrit :

double est plus précis que float, tu as un meilleur résultat, c'est normal.

 
 
 :??:  
 
le bon résultat pour moi c'est 2156.24x100= 215624 et pas 215623.9999997
et 900000.22x100 = 90000022 et pas 9.0000024E7 (ou 90000024 c'est pareil)
 
çà veut dire quoi ? qu'il faille faire un arrondi ?

Reply

Marsh Posté le 26-04-2004 à 20:53:17    

m@nou a écrit :

:??:  
 
le bon résultat pour moi c'est 2156.24x100= 215624 et pas 215623.9999997
et 900000.22x100 = 90000022 et pas 9.0000024E7 (ou 90000024 c'est pareil)
 
çà veut dire quoi ? qu'il faille faire un arrondi ?

ok d'accord. Je crois que tu n'as jamais eu de cours d'analyse numérique.
 
kado :  
http://www.wldelft.nl/soft/d3d/intro/misc/goldberg.pdf
 
tu n'as plus le droit de poser de questions à propos de nombres réels avant d'avoir lu ça (par contre, tu peux demander des explications s'il y a des passages difficiles).


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-04-2004 à 21:03:24    

merci 44 pages en english çà va être rapide à potasser  [:atigrou_tt]  [:bigsmiley]  :whistle:

Reply

Marsh Posté le 26-04-2004 à 21:15:16    

bah si tu n'es pas capable de lire ça, tu peux soit travailler d'abord ton anglais soit arrêter définitivement l'informatique.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-04-2004 à 21:19:53    

y'a toujours des gens aussi aimable ici :D
çà faisait un moment que je n'y avais pas mis les pieds mais je comprends mieux pourquoi maintenant.

Reply

Marsh Posté le 26-04-2004 à 21:28:37    

m@nou a écrit :

y'a toujours des gens aussi aimable ici  

Tu veux quoi de plus ? je te file le meilleur papier sur le sujet, je me fais chier à aller le rechercher sur google et je te donne des conseils.
 
 
Tu veux une pipe 100 balles et un mars avec ça ?


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-04-2004 à 21:42:58    

Parce que t'appelles çà donner des conseils ??
Quelle pédagogie ? Renvoyer une personne qui peut arrêter l'informatique de surcroit dans le premier bouquin (même s'il est le meilleur des papiers sur le sujet).
Mais vu que t'es le surdoué de l'informatique et que tu maîtrises la langue de Shakespeare un minimum d'explications claires, précises et concises sur ce que tu as compris des 44 pages eussent été les bienvenues.  
 
J'espère bien pour toi que n'auras jamais besoin d'un peu d'aide.


Message édité par m@nou le 26-04-2004 à 21:46:48
Reply

Marsh Posté le 26-04-2004 à 21:53:55    

la vie est parfois cruelle.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 26-04-2004 à 21:53:55   

Reply

Marsh Posté le 26-04-2004 à 22:04:39    

ce sujet a déjà été abordé : http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
 
pour aller vite :  
 - l'imprecision des réels vient du changement de base nécessaire à son stockage en mémoire : passage d'un mode décimal (utilisé pour écrire le chiffre dans le source du programme) à un mode binaire (stockage en mémoire).  
 - pour avoir des valeurs décimales exactes, il faut utiliser BigDecimal. Attention, il faut utiliser le constructeur à partir d'une chaine de caractère, sinon une imprecision intervient lors du cast implicite de la valeur passée en paramêtre du constructeur en double (=> avant même d'arriver dans le constructeur de BigDecimal => le BigDecimal stockera la valeur imprécise).
 - il est très rare d'avoir besoin d'une précision très grande des réels. La plupart du temps, l'utilisation de float ou de double suffit. Il faut alors décidé du niveau précision nécessaire qui sera utilisé lors de l'affichage (utilisation d'un DecimalFormat avec le nombre décidé de chiffres après la virgule). C'est seulement au moment de l'affichage que le chagement de base (binaire vers décimal) intervient et que l'imprecision se voit.
 - l'affichage d'un réel n'est pas forcément représentatif de sa valeur : lors de l'affichage (notamment l'affichage par défaut en faissant System.out.println()), un arrondi est effectué. l'arrondisest plus important pour les floats que pour les doubles => un affichage d'un float peut paraitre "plus juste" que l'affichage de la même valeur dans un double. Pour être sûr d'avoir un affichage correcte, il faut utiliser DecimalFormat avec un très grand nombre de chiffres après la virgule
 
hope it helps ...


Message édité par benou le 26-04-2004 à 22:08:35
Reply

Marsh Posté le 26-04-2004 à 22:11:54    

nraynaud a écrit :

la vie est parfois cruelle.


en l'occurence c'est toi qui est cruel là, pas la vie ...

Reply

Marsh Posté le 26-04-2004 à 22:23:01    

benou a écrit :

en l'occurence c'est toi qui est cruel là, pas la vie ...


 
je crois pas, si le gars se dit informaticien (Cf son profil) et qu'il n'est pas capable de lire 40 pauvres pages d'anglais gentillement filé (google ca existe); je lui conseillerai la même chose que nraynaud.

Reply

Marsh Posté le 26-04-2004 à 22:36:35    

:pfff:  
 
quand quelqu'un te demande combien ca fait 1+1 tu le rediriges vers un mémoire sur les mathématiques fondamentales ? [:kiki]
 
edit : va faire un tour sur le lien en question, et donne moi une estimation du temps à prendre pour le lire et le comprendre entièrement ...


Message édité par benou le 26-04-2004 à 22:37:58
Reply

Marsh Posté le 26-04-2004 à 22:51:09    

Merci benou j'avais pas trouvé ce topic
j'avais bien mis "multiplication" mais java  et pas double dans mes mots clés de recherche.
 
Mon problème n'est pas seulement le formatage pour affichage  
puisque le nombre on ne fait pas que l'afficher mais on le passe à une transaction pour les stocker en base. La précision est important car c'est sur une appli bancaire.
 
Je vais potasser le topic et faire des essais.
 

Reply

Marsh Posté le 26-04-2004 à 22:58:22    

benou a écrit :

:pfff:  
 
quand quelqu'un te demande combien ca fait 1+1 tu le rediriges vers un mémoire sur les mathématiques fondamentales ? [:kiki]
 
edit : va faire un tour sur le lien en question, et donne moi une estimation du temps à prendre pour le lire et le comprendre entièrement ...


 
 [:sunn]

Reply

Marsh Posté le 26-04-2004 à 23:00:04    

m@nou a écrit :


on le passe à une transaction pour les stocker en base. La précision est important car c'est sur une appli bancaire.


si tu veux etre sûr, une solution est de le sauver en base sous forme de chaine de caractère et de le manipuler sous forme de BigDecimal

Reply

Marsh Posté le 26-04-2004 à 23:02:43    


ouais bon, rajoutes en pas non plus, quoi :o

Reply

Marsh Posté le 26-04-2004 à 23:47:18    

benou a écrit :

ouais bon, rajoutes en pas non plus, quoi :o


je n'en rajoute pas je trouve simplement ce genre de comportement déplorable  :jap:  
 
merci en tout cas j'ai trouvé mon bonheur dans le topic filé en lien avec la solution en bigformat c'est pile poil à condition d'utiliser le constructeur avec chaine de caractère (moi j'utilisais celui avec double ou float et çà ne fonctionne pas correctement).
 

Code :
  1. BigDecimal b1 = new BigDecimal("2156.24" );
  2. BigDecimal b2 = new BigDecimal("100" );
  3. BigDecimal b3 = b1.multiply(b2);
  4. System.out.println(b3);


 
me donne bien b3=215624.00
 

Code :
  1. BigDecimal b1 = new BigDecimal("900000.22" );
  2. BigDecimal b2 = new BigDecimal("100" );
  3. BigDecimal b3 = b1.multiply(b2);
  4. system.out.println(b3);


me donne bien b3=90000022.00

Reply

Sujets relatifs:

Leave a Replay

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