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

  FORUM HardWare.fr
  Programmation
  Java

  [java] Pb de multiplication de double ?????

 


 Mot :   Pseudo :  
 
 Page :   1  2  3  4
Page Précédente
Auteur Sujet :

[java] Pb de multiplication de double ?????

n°481035
liengy
Approuved !!!
Posté le 08-08-2003 à 14:33:41  profilanswer
 

Voilà j'ai un pb, je dois multipier 2 nb que je récupère dans une base de données....
 
C deux nb sont des doubles.
 
Dans mon ex. je récupère 1.15, et 93.0
Et lorsque je les multiplie (avec l'opérateur * en java), j'obtiens : 106.94999999
au lieu de 106.95 !!!!!!
 
 
 
Est-ce que quelqu'un a une solution , car je comprends meme pas d'ou ça vient ? Sachant que je récupère bien les bons nombres à multiplier comme indiqué....
 
 
 
Merci

mood
Publicité
Posté le 08-08-2003 à 14:33:41  profilanswer
 

n°481045
liengy
Approuved !!!
Posté le 08-08-2003 à 14:40:04  profilanswer
 

Note : D'autres tests m'ont montrée que avec certains nombres ca marche correctement, ex : 69.0x1.15 donne bien 79.35....  :pfff:  
 
J'n'y comprends plus rien....

n°481047
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 08-08-2003 à 14:40:50  profilanswer
 

Tu peux montrer un bout d'ton code qui l'fait, steuplé ?


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°481054
liengy
Approuved !!!
Posté le 08-08-2003 à 14:44:04  profilanswer
 

Code :
  1. double l_tarif = -1 ;
  2. double l_montant = -1 ;
  3. // récup des donées dans la bases...
  4. l_tarif = l_montant * l_correctif.getValeur();


 
voilà....
Sachant que l_tarif et l_montant sont des doubles, getValeur sur l'objet correctif renvoie un double....
ainsi l_montant vaut 93.0,
et l_correctif = 1.15
 
Et j'obtiens l_tarif = 106.94999999  
 
 
.........

n°481071
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 08-08-2003 à 14:50:21  profilanswer
 

Ah yaisse, c'est énorme [:ddr555]
J'viens d'tester avec un prog tout con qui initialise les doubles et affiche le résultat de la multiplication et ça fait c'que t'as dit :lol:


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°481077
benou
Posté le 08-08-2003 à 14:52:39  profilanswer
 

bha ca vient surement de la précision des doubles ...
 
en quoi ca pose problème ?


---------------
ma vie, mon oeuvre - HomePlayer
n°481081
liengy
Approuved !!!
Posté le 08-08-2003 à 14:53:50  profilanswer
 

benou a écrit :

bha ca vient surement de la précision des doubles ...
 
en quoi ca pose problème ?

Bah je dois les afficher dans une appli, et le résultat doit être juste et pas approché !!!

n°481082
liengy
Approuved !!!
Posté le 08-08-2003 à 14:54:03  profilanswer
 

Taiche a écrit :

Ah yaisse, c'est énorme [:ddr555]
J'viens d'tester avec un prog tout con qui initialise les doubles et affiche le résultat de la multiplication et ça fait c'que t'as dit :lol:

pas de soluce ?

n°481085
LetoII
Le dormeur doit se réveiller
Posté le 08-08-2003 à 14:55:17  profilanswer
 

Taiche a écrit :

Ah yaisse, c'est énorme [:ddr555]
J'viens d'tester avec un prog tout con qui initialise les doubles et affiche le résultat de la multiplication et ça fait c'que t'as dit :lol:


 
Heureusement que c du double précison  [:ddr555]


---------------
Le Tyran
n°481086
benou
Posté le 08-08-2003 à 14:55:19  profilanswer
 

liengy a écrit :

Bah je dois les afficher dans une appli, et le résultat doit être juste et pas approché !!!


c'est le plus juste que tu pourras avoir avec des doubles ...
 
t'es sûr que juste à 10 chiffres après la virgule ca te suffit pas ? c'est quand même rare les applis qui demande une précision supérieur à ca ...


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le 08-08-2003 à 14:55:19  profilanswer
 

n°481087
liengy
Approuved !!!
Posté le 08-08-2003 à 14:56:18  profilanswer
 

benou a écrit :


c'est le plus juste que tu pourras avoir avec des doubles ...
 
t'es sûr que juste à 10 chiffres après la virgule ca te suffit pas ? c'est quand même rare les applis qui demande une précision supérieur à ca ...

C pas une question de chiffres apres la virgule....
C ke moi je dois récupérer 106.95 et 106.94 !!!

n°481088
greg@frees​tarthu
Posté le 08-08-2003 à 14:56:30  profilanswer
 

[:gratgrat]


---------------
\^o^/ Libérez HotShot \^o^/
n°481089
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 08-08-2003 à 14:56:33  profilanswer
 

benou a écrit :


c'est le plus juste que tu pourras avoir avec des doubles ...
 
t'es sûr que juste à 10 chiffres après la virgule ca te suffit pas ? c'est quand même rare les applis qui demande une précision supérieur à ca ...


Nan mais non, le résultat de la multi c'est 106.95 et pas 106.94999999 ! Y a Java qui donne un mauvais résultat, enfin un résultat approchant alors que ça a pas lieu d'être [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°481091
liengy
Approuved !!!
Posté le 08-08-2003 à 14:57:21  profilanswer
 

Taiche a écrit :


Nan mais non, le résultat de la multi c'est 106.95 et pas 106.94999999 ! Y a Java qui donne un mauvais résultat, enfin un résultat approchant alors que ça a pas lieu d'être [:spamafote]

:jap:

n°481093
LetoII
Le dormeur doit se réveiller
Posté le 08-08-2003 à 14:57:36  profilanswer
 

Est ce que ça pourait venir d'un problème dans l'unité de calcul flottant du proc? :??:


---------------
Le Tyran
n°481094
liengy
Approuved !!!
Posté le 08-08-2003 à 14:57:44  profilanswer
 

Continu de gratter, et si tu trouves penses à moi... merci....

n°481096
liengy
Approuved !!!
Posté le 08-08-2003 à 14:58:34  profilanswer
 

LetoII a écrit :

Est ce que ça pourait venir d'un problème dans l'unité de calcul flottant du proc? :??:  

Moi pas comprendre....

n°481097
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 08-08-2003 à 15:00:46  profilanswer
 

Pis c'est mortel, ça a l'air de le faire que pour les multiples de 3 [:ddr555]

Citation :


E:\dev>java Hopeula 2 1.15
2.3
 
E:\dev>java Hopeula 3 1.15
3.4499999999999997
 
E:\dev>java Hopeula 4 1.15
4.6
 
E:\dev>java Hopeula 5 1.15
5.75
 
E:\dev>java Hopeula 6 1.15
6.8999999999999995


 
EDIT : ah ba non :

Citation :


E:\dev>java Hopeula 9 1.15
10.35


Message édité par Taiche le 08-08-2003 à 15:01:36

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°481104
LetoII
Le dormeur doit se réveiller
Posté le 08-08-2003 à 15:04:58  profilanswer
 

qqn a un compilo C pour tester?


---------------
Le Tyran
n°481105
benou
Posté le 08-08-2003 à 15:05:13  profilanswer
 

Taiche a écrit :


Nan mais non, le résultat de la multi c'est 106.95 et pas 106.94999999 ! Y a Java qui donne un mauvais résultat, enfin un résultat approchant alors que ça a pas lieu d'être [:spamafote]


bien sûr que si ca a lieu d'être !!!
c'est dû à l'imprecision des doubles !
 
les doubles ne sont pas capable de prendre la valeur de tous les nombres entre son min et son max : c'est pleins de trous ! dans les valeurs proches de 0, les trous sont très petits, mais toi, pas de bole, t'es tombé dans l'un d'eux => il a pris la valeur la plus approchante.
 
mais logiquement, c'est pas un problême ! le tout c'est de savoir qu'elle précision on veut !  
 

Code :
  1. import java.util.*;
  2. import java.text.*;
  3. public class Test {
  4. public static void main(String[] args) {
  5.  double d1 = 1.15;
  6.  double d2 = 93.0;
  7.  DecimalFormat df = new DecimalFormat("0.00" );
  8.  System.out.println(df.format(d1*d2));
  9.  df = new DecimalFormat("0.0000000000" );
  10.  System.out.println(df.format(d1*d2));
  11.  df = new DecimalFormat("0.00000000000000000000" );
  12.  System.out.println(df.format(d1*d2));
  13. }
  14. }


Citation :

106,95
106,9500000000
106,94999999999999000000


 


---------------
ma vie, mon oeuvre - HomePlayer
n°481107
benou
Posté le 08-08-2003 à 15:06:20  profilanswer
 

LetoII a écrit :

qqn a un compilo C pour tester?


ca fera pareil ... tout dépend du nombre de bytes alloués au nombre ...


---------------
ma vie, mon oeuvre - HomePlayer
n°481108
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 08-08-2003 à 15:06:45  profilanswer
 

benou a écrit :


bien sûr que si ca a lieu d'être !!!
c'est dû à l'imprecision des doubles !


Ahhhhhhhhh... ba j'me coucherai moins con :o
(quoique me coucher plus con aurait été difficile :o)


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
n°481113
greg@frees​tarthu
Posté le 08-08-2003 à 15:08:16  profilanswer
 

liengy a écrit :

Continu de gratter, et si tu trouves penses à moi... merci....

[:slam dunk]


---------------
\^o^/ Libérez HotShot \^o^/
n°481114
LetoII
Le dormeur doit se réveiller
Posté le 08-08-2003 à 15:08:42  profilanswer
 

benou a écrit :


ca fera pareil ... tout dépend du nombre de bytes alloués au nombre ...  


 
Le truc c que je me suis jamais penché sur le fonctionnement des double.
 
Moralité travail avec des float  [:ddr555]


---------------
Le Tyran
n°481116
greg@frees​tarthu
Posté le 08-08-2003 à 15:09:41  profilanswer
 

ouais enfin un "trou" de precision a deux decimales c'est un peu gros nan ? :mlc:


---------------
\^o^/ Libérez HotShot \^o^/
n°481118
benou
Posté le 08-08-2003 à 15:10:59  profilanswer
 

greg@freestarthu a écrit :

ouais enfin un "trou" de precision a deux decimales c'est un peu gros nan ? :mlc:


ouais, c'est clair ...
 
j'ai essayé avec des BigDecimal et ca fait pareil ... là par contre, j'aurais pas cru :/


---------------
ma vie, mon oeuvre - HomePlayer
n°481119
greg@frees​tarthu
Posté le 08-08-2003 à 15:12:51  profilanswer
 

Code :
  1. public class TestLong {
  2. public static void main(String[] args) {
  3.  double a = 1.15d;
  4.  double b = 93.0d;
  5.  double ab = a*b;
  6.  System.out.println("ab=" + ab);
  7.  float x = 1.15f;
  8.  float y = 93.0f;
  9.  float xy = x*y;
  10.  System.out.println("xy=" + xy);
  11. }
  12. }

 
 

Citation :

ab=106.94999999999999
xy=106.95

 
donc en choisissant d'etre moins précis, au moins t'as le bon résultat [:ddr555]


Message édité par greg@freestarthu le 08-08-2003 à 15:14:36

---------------
\^o^/ Libérez HotShot \^o^/
n°481125
benou
Posté le 08-08-2003 à 15:16:27  profilanswer
 

bref, en travaillant avec des décimaux, tu ne peux pas avoir de valeur exacte, juste des valeur très approchante. Dans la limite où tu accepte une certaine impression  (ce qui est le cas de la majorité des applications), par exemple une imprecision de 10^-10, tu retombre sur tes jambes puisque l'imprecision des doubles autour de 0 est inférieur à 10^-10


---------------
ma vie, mon oeuvre - HomePlayer
n°481126
benou
Posté le 08-08-2003 à 15:17:24  profilanswer
 

greg@freestarthu a écrit :


donc en choisissant d'etre moins précis, au moins t'as le bon résultat [:ddr555]


[:gratgrat] ca c'est marrant par contre :)


---------------
ma vie, mon oeuvre - HomePlayer
n°481131
benou
Posté le 08-08-2003 à 15:19:22  profilanswer
 

benou a écrit :


[:gratgrat] ca c'est marrant par contre :)


nan, c'est parce que le truc chargé d'afficher le float l'affiche avec une moins grande précision :
 

Code :
  1. import java.text.*;
  2. public class Test {
  3. public static void main(String[] args) {
  4.  float d1 = 1.15f;
  5.  float d2 = 93.0f;
  6.  System.out.println(d1*d2);
  7.  DecimalFormat df = new DecimalFormat("0.00" );
  8.  System.out.println(df.format(d1*d2));
  9.  df = new DecimalFormat("0.00000" );
  10.  System.out.println(df.format(d1*d2));
  11.  df = new DecimalFormat("0.0000000000" );
  12.  System.out.println(df.format(d1*d2));
  13.  df = new DecimalFormat("0.00000000000000000000" );
  14.  System.out.println(df.format(d1*d2));
  15. }
  16. }


 

Citation :

106.95
106,95
106,95000
106,9499969482
106,94999694824219000000


 
 
 
edit :
 
liengy > conclusion :
tu choisis une précision (ex : 10^-10). tu créés un DecimalFormat correspondant : df = new DecimalFormat("0.##########" ); (le nombre de '#' est la précision en nombre de chiffres après la virgule), et tu passes par cet objet Format pour afficher tes résultats, et tu auras le résultat attendu.
 
 
edit2 : y a quand même des trucs que je capte pas :

Code :
  1. public static void main(String[] args) {
  2.  double x = 1.15d;
  3.  double y = 93.0d;
  4.  double xy = x * y;
  5.  System.out.println("xy=" + xy);
  6.  double xyFoisBcp = xy * 10000d;
  7.  System.out.println("xyFoisBcp=" + xyFoisBcp);
  8. }


Citation :

xy=106.94999999999999
xyFoisBcp=1069500.0


[:gratgrat] j'aurais cru que ca aurait fait 1069499.9999999999
 mais en fait, c'est peut être le compilo qui vient foutre sa merde et qui fait la calculs à la compile [:w3c compliant]


Message édité par benou le 08-08-2003 à 15:32:20

---------------
ma vie, mon oeuvre - HomePlayer
n°481154
greg@frees​tarthu
Posté le 08-08-2003 à 15:34:37  profilanswer
 

ben attend, 1.15 * 93, ça FAIT 106.95 ... ! je comprend toujours pas...


---------------
\^o^/ Libérez HotShot \^o^/
n°481169
benou
Posté le 08-08-2003 à 15:43:42  profilanswer
 

greg@freestarthu a écrit :

ben attend, 1.15 * 93, ça FAIT 106.95 ... ! je comprend toujours pas...


[:smiley qui se tape la tête contre les murs]
 
fallait suivre tes cours d'infos à la fac !!! :o


---------------
ma vie, mon oeuvre - HomePlayer
n°481171
benou
Posté le 08-08-2003 à 15:45:00  profilanswer
 

bon ...
je mange et après j'explique ...


---------------
ma vie, mon oeuvre - HomePlayer
n°481175
darklord
You're welcome
Posté le 08-08-2003 à 15:45:44  profilanswer
 

benou a écrit :


[:smiley qui se tape la tête contre les murs]
 
fallait suivre tes cours d'infos à la fac !!! :o


 
 :whistle:

n°481178
liengy
Approuved !!!
Posté le 08-08-2003 à 15:46:44  profilanswer
 

benou a écrit :


[ :smiley qui se tape la tête contre les murs]
 
fallait suivre tes cours d'infos à la fac !!! :o

celui-là [:nowad] peut-être ????


Message édité par liengy le 08-08-2003 à 15:47:09
n°481183
LetoII
Le dormeur doit se réveiller
Posté le 08-08-2003 à 15:48:37  profilanswer
 

C benou qui a raison, après m'ettre rafraichi la mémoire sur le format des float c tt de suite devenu limpide:
 
http://www.psc.edu/general/softwar [...] /ieee.html


---------------
Le Tyran
n°481186
benou
Posté le 08-08-2003 à 15:51:50  profilanswer
 
n°481189
greg@frees​tarthu
Posté le 08-08-2003 à 15:55:36  profilanswer
 

benou a écrit :


[:smiley qui se tape la tête contre les murs]
 
fallait suivre tes cours d'infos à la fac !!! :o

mes cours de ? à la ...????


---------------
\^o^/ Libérez HotShot \^o^/
n°481191
greg@frees​tarthu
Posté le 08-08-2003 à 15:55:53  profilanswer
 

[:fenris]


---------------
\^o^/ Libérez HotShot \^o^/
n°481200
benou
Posté le 08-08-2003 à 15:58:13  profilanswer
 

greg@freestarthu a écrit :

mes cours de ? à la ...????


t'as capté ou non ?


---------------
ma vie, mon oeuvre - HomePlayer
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4
Page Précédente

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

  [java] Pb de multiplication de double ?????

 

Sujets relatifs
Java + XML + Crystal Reports9 dev ----> Cherrytree, tu es là ?bouquin d'initiation à la prog nécessitant FORTE FOR JAVA.
connaitre la largeur d'une chaine en java (ou plutôt jsp)(Java) GridBagLayout et garder une colonne de largeur fixe
[Java] Ecrire un fichier MIDIJava JNI
JIT compiler pour java[JAVA XML] Une JSP bien formée
[JAVA] lancer un script depuis java[JAVA] FTP sous Eclipse, comment activer le transfert ASCII?
Plus de sujets relatifs à : [java] Pb de multiplication de double ?????


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