Come si può ovviare a questo problema?
Arrotondalo a N cifre
--------------------------------
Inviato via http://arianna.libero.it/usenet/
Ok, ma vorrei sapere se e' giusto che accada e perche' succede.
Perchè i tipi float e double sono *approssimazioni* (a 32 e 64 bit
risp.) di numeri con virgola: possono infatti rappresentare 2^32 o 2^64
valori, e non è detto (anzi è molto raro) che corrispondano alla loro
rappresentazione.
Se vuoi corrispondenza (quasi) perfette fra rappresentazione e numero,
usa BigDecimal:
BigDecimal a = new BigDecimal("4.2");
BigDecimal b = a.multiply(new BigDecimal("6"));
NB mi raccomando le virgolette, altrimenti ottieni lo stesso risultato
di prima ! A tal proposito ti consiglio di fare un'interessante esperimento:
double d = 4.2;
BigDecimal bd = new BigDecimal(d);
System.out.println("Valore di d (double) : " + d);
System.out.println("Valore di bd(BigDecimal): " + bd);
AAAAAAARRGGGhh !
--
-- + Setaceous Pig + --
http://megadix.users.mcs2.netarray.com/
http://www.jroller.com/page/megadix/
E' giusto
deriva dalla aritmetica dei floating points
Una delle soluzioni e' usare BigDecimal
un'altra e' arrotondare a mano
http://docs.sun.com/source/806-3568/ncg_goldberg.html#680
prova google IEEE754-1985
http://www.google.it/search?q=double+imprecision+in+java&ie=UTF-8&hl=it&lr=
oppure cerca nei forum tecnici della sun
Con una gaussiana: replichi il risultato un numero consistente di volte
e ne fai la media pesata, con lo scarto quadratico trovi la devianza e
sottraendo ricavi 25.2