essayer *= en opérateur.
essayer *= en opérateur.
Voici une 'tite méthode qui fonctionne à merveille pour faire des arrondis
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 /** * Arrondi un double a à la précision p * @param a la valeur à arrondir * @param p la précision demandée 10^-p * @return la valeur arrondi */ public static final double arrondir(double a, int p) { return (Math.round(a * Math.pow(10, p))) / (Math.pow(10, p)); }
je me répète, mais si 1.2 n'a pas de représentation précise en double alors ça sert à quoi ?? sinon je suis d'accord qu'une légère imprcision de la représenatation d'un nombre cause des erreurs.
Disons que si tu calcules 10 + 6,33 + 6,33 euros tu obtiendras 22.65999999999999999999999 je crois (en double). Comme en euros, seules les deux premières valeurs après la virgule t'intéressent, tu arrondis et hop, le résultats est bon.
Les doubles permettent d'avoir des valeurs très très proches des "vraies" dans un ensemble de définition immense. Dans la plupart des cas (99%), c'est largement suffisant. Mais si tu dois travailler sur des valeurs décimal exactes qui ne souffrent d'aucune erreur de calcul (ie. si tu veux obtenir 22.66 exactement dans le calcul précédent), alors il faut utiliser autre chose.
moi je savais pas qu'on programmait des ordi pour donner de mauvais résultats !!!Non c'est pas sérieux je pense
1+1=2 même avec des doubles, simplement si tu obtiens 1.99999999999999999 c'est parce que tu n'as pas rentré en machine 1+1 c'est tout mais plutôt 1.0000000000000000000000001+0.999999999999999999999998=1.999999999999999999999999999
après faut comprendre pourquoi ton 1 devient 1.00000000000000000001 pour éviter ce problème.
Bon je dis ça mais j'y connais juste un tout petit peu dans ce domaine ! Mais ça me paraît un peu faux ce que tu dis ! je trouve pas grand chose sur google sur le type double....
Moi je pense que vu que les doubles sont sur 64 bits, je pense que le fait d'écrire à la main dans ton programme le chiffre 2 ou 1 ou 1.2 , ça ne suffit pas, il faut l'écrire peut être sous forme d'un tableau de 64 bits ! pour avoir un vrai 2,0000000000000000 ou 1.00000000000000
Ca serait à essayer de d'abord écrire ses nombres en binaires 64 bits et ensuite de les convertir en double, c'est peut être la clef du problème !
Je sais qu'à un certain niveau mathématico-informatique, les calculs se font par l'intermédiaire des opérateurs de bits et non des opérateurs usuels... (gain de temps de précision...)
Voilà des pistes à creuser...
d'ailleurs il serait bien d'ajouter aux forums de developpez.com un thread concernant les calculs numériques / méthodes numériques / calculs scientifiques
Moi??? Mais j'ai rien dit....Mais ça me paraît un peu faux ce que tu dis !![]()
http://java.sun.com/j2se/1.4.2/docs/api/index.html
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances notwithstanding.(euh, bon, c'est une traduction Google, mais on comprend l'idée)Note: les résultats de ce constructeur peuvent être quelque peu imprévisibles. L'on a pourrait supposer qui nouveau BigDecimal(.1) est exactement égal au .1, mais elle est réellement égale au .1000000000000000055511151231257827021181583404541015625. C'est ainsi parce que le .1 ne peut pas être représenté exactement comme double (ou, pour cette matière, comme fraction binaire de toute longueur finie). Ainsi, la longue valeur qui est passée dedans au constructeur n'est pas exactement égale au .1, malgré aspects.
J'ai le même genre de problème avec les float ??
s7=s7+(float)8.9;
jLabel13.setText(String.valueOf(s7));
s7 est au départ à 0. Voici ce que ce calcul donne déjà aprés 3 calculs...![]()
1 - 8.9
2 - 17.8
3 - 26.6999999
Merci, la fonction postée ci dessus marche nickel pour moi (je suis passé en double...)
Partager