Italian Problema con il formato Double molto strano...

ellpopeb4a

Member
Licensed User
Longtime User
Ciao a tutti e ben trovati sono Stefano è da un po che vi seguo e oggi vi chiedo aiuto su una cosa che non riesco a capire …
Volevo fare una semplice moltiplicazione con un Double ma ottengo risultati non attesi e non mi spiego il perché.
In pratica se moltiplico 0.15 x 3 ottengo 0,44999 invece che 0.45 come mi aspetterei..
Ecco in semplice esempio..

B4X:
Dim ResultD As Double
Dim ResultF As Float
Dim Txt = "" As String

ResultD = 0.15 * 3 'ResultD -> 0.44999999999999  
Txt = ResultD      'Txt -> 0.44999999999999

ResultF= 0.15 * 3  'ResultF -> 0.45  OK
Txt = ResultF      'Txt -> 0.449999880790  e qui xke???
Txt = NumberFormat(ResultF ,1,2) 'Txt -> 0.45  OK
Grazie a tutti.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
E' normalissimo, niente di strano.

I numeri a virgola mobile, Float e Double, vengono memorizzati in mantissa ed esponente, dove quindi il numero reale memorizzato viene calcolato come mantissa per 2 elevato all'esponente.

Da qui si capisce subito che c'è sempre un piccolo grado di errore, trovi maggiori informazioni qui: Numero in virgola_mobile

Ti consiglio quindi una volta finito il calcolo di arrotondare il numero a quante cifre decimali ti servono, ad esempio:
B4X:
ResultD = Round2(0.15 * 3, 2)

Sergio
 
Last edited:

ellpopeb4a

Member
Licensed User
Longtime User
E' normalissimo, niente di strano.

I numeri a virgola mobile, Float e Double, vengono memorizzati in mantissa ed esponente, dove quindi il numero reale memorizzato viene calcolato come mantissa per 2 elevato all'esponente.

Grazie mille Sergio … spiegazione molto esauriente e utile ora ho capito...
Userò Round2 Grazie ancora ciaooo
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
E' normalissimo, niente di strano.

I numeri a virgola mobile, Float e Double, vengono memorizzati in mantissa ed esponente, dove quindi il numero reale memorizzato viene calcolato come mantissa per 2 elevato all'esponente.

Da qui si capisce subito che c'è sempre un piccolo grado di errore, trovi maggiori informazioni qui: Numero in virgola_mobile

Ti consiglio quindi una volta finito il calcolo di arrotondare il numero a quante cifre decimali ti servono, ad esempio:
B4X:
ResultD = Round2(0.15 * 3, 2)

Sergio
Ottima ed utile spiegazione :sign0098:
 
Top