Formattazione numeri

Ciao a tutti,
oggi sto combattendo contro numeri Double, formattazione e CDbl.
Ho questo codice:

Dim Num As Double = 16,1999999999999993
Dim NumAlfa As String = Format(Num, "0.00")   // 16,20
Return CDbl(NumAlfa)   // 16,1999999999999993 ?????

Mi chiedo: ma se una stringa (NumAlfa) contiene “16,20”, perch la sua conversione in Double mi deve dare 16,1999999999999993 ???
Qualcuno mi sa risolvere questo (apparente) enigma?

Grazie!

Nedi

Argomento affrontato diverse volte.
Un Double e rappresentato in memoria secondo uno standard ben preciso (in pratica potenze di 2 negative per la parte decimale) e quindi impossibile avere una rappresentazione esatta (tranne che per pochi casi)
In genere per i numeri che devi trattare si tratta di problemi (rumore introdotto) al di sotto della tua soglia (ho usato termini da segnali perch rappresentano meglio il fenomeno)

Per cui non un enigma, tutti i linguaggi e sistemi ne sono affetti. Non un problema fintanto che ne sei cosciente (dipende dal tuo grado di accuratezza necessario)
Per questo vedi anche questa pagina in inglese sui double, in particolare l’esempio del numero pi piccolo maggiore di 1.

Se vai a vedere lo stesso motivo per cui il confronto (=) tra due Double va fatto cum grano salis e spesso conviene usare il metodo (Equals) quando il confronto diventa molto ravvicinato.

Se hai necessit di ovviare a questo problems per numeri come importi in valuta, ecc. puoi usare il data type Currency.

In generale, se devi utilizzare double, evita il pi possibile conversioni da e a stringa. Mantieni sempre il numero in una propriet Double e convertilo a stringa solo quando devi visualizzarlo.

Grazie Antonio e Massimo! Ne terr conto, d’ora in poi.