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

Pb de multiplication de double ????? [java] - Java - Programmation

Marsh Posté le 08-08-2003 à 14:33:41    

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

Reply

Marsh Posté le 08-08-2003 à 14:33:41   

Reply

Marsh Posté le 08-08-2003 à 14:40:04    

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....

Reply

Marsh Posté le 08-08-2003 à 14:40:50    

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.
Reply

Marsh Posté le 08-08-2003 à 14:44:04    

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  
 
 
.........

Reply

Marsh Posté le 08-08-2003 à 14:50:21    

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.
Reply

Marsh Posté le 08-08-2003 à 14:52:39    

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


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

Marsh Posté le 08-08-2003 à 14:53:50    

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é !!!

Reply

Marsh Posté le 08-08-2003 à 14:54:03    

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 ?

Reply

Marsh Posté le 08-08-2003 à 14:55:17    

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
Reply

Marsh Posté le 08-08-2003 à 14:55:19    

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
Reply

Marsh Posté le 08-08-2003 à 14:55:19   

Reply

Marsh Posté le 08-08-2003 à 14:56:18    

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 !!!

Reply

Marsh Posté le 08-08-2003 à 14:56:30    

[:gratgrat]


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 08-08-2003 à 14:56:33    

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.
Reply

Marsh Posté le 08-08-2003 à 14:57:21    

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:

Reply

Marsh Posté le 08-08-2003 à 14:57:36    

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


---------------
Le Tyran
Reply

Marsh Posté le 08-08-2003 à 14:57:44    

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

Reply

Marsh Posté le 08-08-2003 à 14:58:34    

LetoII a écrit :

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

Moi pas comprendre....

Reply

Marsh Posté le 08-08-2003 à 15:00:46    

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.
Reply

Marsh Posté le 08-08-2003 à 15:04:58    

qqn a un compilo C pour tester?


---------------
Le Tyran
Reply

Marsh Posté le 08-08-2003 à 15:05:13    

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
Reply

Marsh Posté le 08-08-2003 à 15:06:20    

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
Reply

Marsh Posté le 08-08-2003 à 15:06:45    

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.
Reply

Marsh Posté le 08-08-2003 à 15:08:16    

liengy a écrit :

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

[:slam dunk]


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 08-08-2003 à 15:08:42    

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
Reply

Marsh Posté le 08-08-2003 à 15:09:41    

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


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 08-08-2003 à 15:10:59    

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
Reply

Marsh Posté le 08-08-2003 à 15:12:51    

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^/
Reply

Marsh Posté le 08-08-2003 à 15:16:27    

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
Reply

Marsh Posté le 08-08-2003 à 15:17:24    

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
Reply

Marsh Posté le 08-08-2003 à 15:19:22    

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
Reply

Marsh Posté le 08-08-2003 à 15:34:37    

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


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 08-08-2003 à 15:43:42    

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
Reply

Marsh Posté le 08-08-2003 à 15:45:00    

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


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

Marsh Posté le 08-08-2003 à 15:45:44    

benou a écrit :


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


 
 :whistle:

Reply

Marsh Posté le 08-08-2003 à 15:46:44    

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
Reply

Marsh Posté le 08-08-2003 à 15:48:37    

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
Reply

Marsh Posté le 08-08-2003 à 15:51:50    

Reply

Marsh Posté le 08-08-2003 à 15:55:36    

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^/
Reply

Marsh Posté le 08-08-2003 à 15:55:53    

[:fenris]


---------------
\^o^/ Libérez HotShot \^o^/
Reply

Marsh Posté le 08-08-2003 à 15:58:13    

greg@freestarthu a écrit :

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


t'as capté ou non ?


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

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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