Programming Languages Hacks

Importanti regole per linguaggi di programmazione rilevanti come Java, C, C++, C#…

  • Subscribe

  • Lettori

    I miei lettori abituali

  • Twitter

La Precisione dei tipi “double”

Posted by Ricibald on June 26th, 2008

I double vengono memorizzati in binario (in Java, C#, C++, C…). Questo potrebbe provocare problemi di precisione nei calcoli.

Si consideri infatti:

double d = 0D;
for (int i = 0; i < 10; i++)
{
   d += 0.10D;
} // d = 0.9999999999...

Il double d non vale 1, ma vale 0.9999… Perché? Consideriamo lo stesso calcolo riscritto in questo modo:

double d2 = 0D;
for (int j = 0; j < 8; j++)
{
   d2 += 0.125D;
} // d2 = 1.0

Stavolta d vale 1. Questo perché 0.125 vale 2-3: una potenza di 2. Significa quindi che è esprimibile come binario, e mantiene la precisione.

In generale questo non è un problema poiché la stampa di 0.9999999 produce a video 1. Ma si consideri il seguente codice:

double d3 = 1.0675;
d3 = d3 * 100;                              // d3 = 106.74999999....
Console.WriteLine(d3);                      // output = 106.75
double d4 = Double.Parse(d3.ToString());    // d4 = 106.75
d5 = 106.75;
d5 == d4;                                   // true
d5 == d3;                                   // false

Se ad esempio vogliamo testare se il nostro valore e’ pari a 2.0, questo semplice confronto potrebbe dar risultato negativo.
In questi casi la soluzione consiste nell’utilizzare il tipo decimal o creare una classe Currency che internamente usa il tipo long.

Leave a Reply

You must be logged in to post a comment.