[Db] Mysql e calcoli in virgola mobile

Marcello Vezzelli marcello a vezz.it
Gio 11 Gen 2007 18:03:15 CET


Davide Michel 'ZioBudda' Morelli wrote:
> Marcello Vezzelli ha scritto:
>>
>> Usa double oppure decimal, che hanno precisione maggiore.
>
> Devo iniziare a ricredermi su mysql ?

Mah, in meglio o in peggio? :)
>
>> Gli arrotondamenti sono dovuti alla rappresentazione interna dei 
>> numeri in virgola mobile.
>
> Se sballa per cosi' poco non oso immaginare per numeri piu' complessi.

Il "così poco" è un concetto che non esiste nella rappresentazione dei 
numeri in virgola mobile con esponente e mantissa... la differenza tra 
due numeri "consecutivi" dipende esclusivamente dalla precisione.
Se ci sono alcune conversioni double->float e viceversa nei vari 
passaggi che fa mysql, si possono introdurre errori di rappresentazione 
come quello che hai visto tu.
La cosa migliore da fare è usare la miglior precisione disponibile 
(qualora non ci siano controindicazioni) e comunque utilizzare sempre 
numeri arrotondati alla n-esima cifra significativa. Questo riduce di 
molto gli errori di rappresentazione.

Quello 0.0099999997764826 che ti trovi, se lo tratti come
round(0.0099999997764826  * 1000) /1000
ti dà un bel 0.01 come ti aspetti.

Non è un problema di mysql ma è un problema dei numeri floating point.

Saluti
Marcello








Maggiori informazioni sulla lista Db