60 messaggi dal 02 luglio 2002
Salve, ho il seguente problema

ho un numero 0.99989 , devo moltiplicarlo per 100.

mi aspetterei come risultato 99.989 ed invece eseguendo il codice c# per fare le operazioni ottengo risultati "strani" almeno per me.
ho provato sia con variabili double che con variabili float.

qualcuno sa spiegarmi perchè?

grazie

di seguito il codice:

double numD = 0.99989;
float numF = 0.99989F;

double resD = 0;
float resF = 0;

double moltD = 100;
float moltF = 100;

resD = numD * moltD; // result resD 99.98899999999999double
resF = numF * moltF; // result resF 99.989006 float
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,


ottengo risultati "strani"

già, sono risultati approssimati.

Osserva per esempio il tipo int, che è un numero intero a 32 bit. Secondo l'msdn, ti consente di archiviare numeri compresi in un intervallo che va da (circa) -2 miliardi a +2 miliardi. Se fai un calcolo, sono ammessi pressappoco 4 miliardi di numeri che è esattamente il valore di 2^32.

Ora osserva float, che è un tipo di numero a virgola mobile anch'esso a 32 bit. Secondo msdn il suo intervallo va da un numero decimale piccolissimo come 1.5×10^-45 ad un numero enorme come 3,4 × 10^38. Com'è possibile che, nello spazio di 32 bit - lo stesso di un int - si possano rappresentare tutti quei numeri? La risposta è che non si può. O almeno non senza perdere in risoluzione.
float e double sono due tipi che ti consentono di lavorare con numeri molto piccoli o molto grandi, ma a scapito della precisione.

Qui trovi spiegati questo e altri problemi legati a questo tipo di dato.
http://it.wikipedia.org/wiki/Numero_in_virgola_mobile#Problemi_con_l.27uso_della_virgola_mobile

Se vuoi operare in maniera esatta con i numeri decimali, usa il tipo decimal che è quello più indicato anche in ambito finanziario perché i numeri vengono rappresentati in memoria in maniera precisa.
decimal numD = 0.99989m; //il suffisso m indica che si tratta di un numero decimal
decimal resD = 0m;
decimal moltD = 100m;

resD = numD * moltD; // result resD 99.989


decimal è un numero a 128bit che ammette circa 28 cifre significative che credo siano sufficienti nella maggior parte degli scenari.
http://msdn.microsoft.com/it-it/library/364x0z75%28v=vs.80%29

ciao
Modificato da BrightSoul il 13 luglio 2012 23.50 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.