Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1616 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°709078
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 20:26:36  profilanswer
 

: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
mood
Publicité
Posté le 26-04-2004 à 20:26:36  profilanswer
 

n°709095
nraynaud
lol
Posté le 26-04-2004 à 20:39:22  profilanswer
 

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


---------------
trainoo.com, c'est fini
n°709101
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 20:43:28  profilanswer
 

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 ?

n°709112
nraynaud
lol
Posté le 26-04-2004 à 20:53:17  profilanswer
 

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
n°709122
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 21:03:24  profilanswer
 

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

n°709132
nraynaud
lol
Posté le 26-04-2004 à 21:15:16  profilanswer
 

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
n°709134
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 21:19:53  profilanswer
 

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.

n°709141
nraynaud
lol
Posté le 26-04-2004 à 21:28:37  profilanswer
 

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
n°709152
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 21:42:58  profilanswer
 

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
n°709156
nraynaud
lol
Posté le 26-04-2004 à 21:53:55  profilanswer
 

la vie est parfois cruelle.


---------------
trainoo.com, c'est fini
mood
Publicité
Posté le 26-04-2004 à 21:53:55  profilanswer
 

n°709162
benou
Posté le 26-04-2004 à 22:04:39  profilanswer
 

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
n°709166
benou
Posté le 26-04-2004 à 22:11:54  profilanswer
 

nraynaud a écrit :

la vie est parfois cruelle.


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

n°709176
Profil sup​primé
Posté le 26-04-2004 à 22:23:01  answer
 

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.

n°709179
benou
Posté le 26-04-2004 à 22:36:35  profilanswer
 

: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
n°709183
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 22:51:09  profilanswer
 

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.
 

n°709190
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 22:58:22  profilanswer
 

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]

n°709191
benou
Posté le 26-04-2004 à 23:00:04  profilanswer
 

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

n°709196
benou
Posté le 26-04-2004 à 23:02:43  profilanswer
 


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

n°709225
m@nou
vu z'avais pas vu
Posté le 26-04-2004 à 23:47:18  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
[Delphi/Interbase]Probleme de dateProbleme avec $PHP_SELF
probleme declaration operateur newProblème de trigger (BdD et trigger présents)
[Borland c++ builder 5] problème liste de suivis[Java] Comment faire un splash screen ?
[Java] Boite de dialogue standard[Probleme] _inp & _outp
probleme de nom décoré DLL C (résolu)[JAVA] [JDBC] exception sur executeUpdate(...)
Plus de sujets relatifs à : [java] problème avec la précision des nombres réels


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR