Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Tipo double impreciso?

0 views
Skip to first unread message

Sillaba

unread,
Jul 19, 2004, 9:30:22 AM7/19/04
to
Perche se moltiplico 4.2 con 6 (entrambi di tipo double) ottengo
25.200000000000003 e non 25.2?

Come si può ovviare a questo problema?


n.n

unread,
Jul 19, 2004, 9:37:34 AM7/19/04
to
> Perche se moltiplico 4.2 con 6 (entrambi di tipo double) ottengo
> 25.200000000000003 e non 25.2?
>
> Come si può ovviare a questo problema?
>

Arrotondalo a N cifre

--------------------------------
Inviato via http://arianna.libero.it/usenet/

Sillaba

unread,
Jul 19, 2004, 9:39:42 AM7/19/04
to
> > Perche se moltiplico 4.2 con 6 (entrambi di tipo double) ottengo
> > 25.200000000000003 e non 25.2?
> >
> > Come si può ovviare a questo problema?
> >
>
> Arrotondalo a N cifre
>

Ok, ma vorrei sapere se e' giusto che accada e perche' succede.


Dimitri De Franciscis

unread,
Jul 19, 2004, 10:07:02 AM7/19/04
to

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/

n.n

unread,
Jul 19, 2004, 10:09:38 AM7/19/04
to
>
> Ok, ma vorrei sapere se e' giusto che accada e perche' succede.
>

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

Sailor

unread,
Jul 19, 2004, 6:42:56 PM7/19/04
to
Sillaba wrote:

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

0 new messages