Pb de multiplication de double ????? [java] - Java - Programmation
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....
J'n'y comprends plus rien....
Marsh Posté le 08-08-2003 à 14:40:50
Tu peux montrer un bout d'ton code qui l'fait, steuplé ?
Marsh Posté le 08-08-2003 à 14:44:04
Code :
|
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
.........
Marsh Posté le 08-08-2003 à 14:50:21
Ah yaisse, c'est énorme
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
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 ?
Marsh Posté le 08-08-2003 à 14:53:50
benou a écrit : bha ca vient surement de la précision des doubles ... |
Bah je dois les afficher dans une appli, et le résultat doit être juste et pas approché !!!
Marsh Posté le 08-08-2003 à 14:54:03
Taiche a écrit : Ah yaisse, c'est énorme |
pas de soluce ?
Marsh Posté le 08-08-2003 à 14:55:17
Taiche a écrit : Ah yaisse, c'est énorme |
Heureusement que c du double précison
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 ...
Marsh Posté le 08-08-2003 à 14:56:18
benou a écrit : |
C pas une question de chiffres apres la virgule....
C ke moi je dois récupérer 106.95 et 106.94 !!!
Marsh Posté le 08-08-2003 à 14:56:33
benou 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
Marsh Posté le 08-08-2003 à 14:57:21
Taiche a écrit : |
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?
Marsh Posté le 08-08-2003 à 14:57:44
ReplyMarsh 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....
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
Citation : |
EDIT : ah ba non :
Citation : |
Marsh Posté le 08-08-2003 à 15:05:13
Taiche a écrit : |
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 :
|
Citation : 106,95 |
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 ...
Marsh Posté le 08-08-2003 à 15:06:45
benou a écrit : |
Ahhhhhhhhh... ba j'me coucherai moins con
(quoique me coucher plus con aurait été difficile )
Marsh Posté le 08-08-2003 à 15:08:16
liengy a écrit : Continu de gratter, et si tu trouves penses à moi... merci.... |
Marsh Posté le 08-08-2003 à 15:08:42
benou a écrit : |
Le truc c que je me suis jamais penché sur le fonctionnement des double.
Moralité travail avec des float
Marsh Posté le 08-08-2003 à 15:09:41
ouais enfin un "trou" de precision a deux decimales c'est un peu gros nan ?
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 ? |
ouais, c'est clair ...
j'ai essayé avec des BigDecimal et ca fait pareil ... là par contre, j'aurais pas cru
Marsh Posté le 08-08-2003 à 15:12:51
Code :
|
Citation : ab=106.94999999999999 |
donc en choisissant d'etre moins précis, au moins t'as le bon résultat
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
Marsh Posté le 08-08-2003 à 15:17:24
greg@freestarthu a écrit : |
ca c'est marrant par contre
Marsh Posté le 08-08-2003 à 15:19:22
benou a écrit : |
nan, c'est parce que le truc chargé d'afficher le float l'affiche avec une moins grande précision :
Code :
|
Citation : 106.95 |
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 :
|
Citation : xy=106.94999999999999 |
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
Marsh Posté le 08-08-2003 à 15:34:37
ben attend, 1.15 * 93, ça FAIT 106.95 ... ! je comprend toujours pas...
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... |
fallait suivre tes cours d'infos à la fac !!!
Marsh Posté le 08-08-2003 à 15:45:00
ReplyMarsh Posté le 08-08-2003 à 15:45:44
ReplyMarsh Posté le 08-08-2003 à 15:46:44
benou a écrit : |
celui-là peut-être ????
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
Marsh Posté le 08-08-2003 à 15:55:36
benou a écrit : |
mes cours de ? à la ...????
Marsh Posté le 08-08-2003 à 15:55:53
ReplyMarsh Posté le 08-08-2003 à 15:58:13
greg@freestarthu a écrit : mes cours de ? à la ...???? |
t'as capté ou non ?
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