[MontelLUG] Mysql e decimali

Davide Rondini davide.rondini a gmail.com
Ven 30 Set 2011 14:49:02 CEST


In data venerdì 30 settembre 2011 12:55:21, Samuele ha scritto:
>   Il 30/09/2011 12:42, Daneel Olivaw ha scritto:
> > Giorno gente.
> > 
> > Come tutti saprete (ma anche no), in Mysql si possono salvare numeri
> > decimali dichiarandoli "Decimal", "Float" o "Double".
> > Considerando che il numero che dovrò gestire avrà un massimo di 4
> > cifre per la parte intera e due per la parte decimale ed è inserito
> > dall'utente, quindi sempre positivo e mai risultato di calcoli o cose
> > strane , pensavo di usare "Decimal", ma mi sono chiesto... "E gli
> > altri?"
> 
> Per esperienza con altri motori di database, usa Decimal in quanto puoi
> impostare la precisione dopo la virgola che vuoi. Ormai non ricordo più
> il perché ed il percome, la rava e la fava (erano i tempi del passaggio
> da lira ad euro), però a causa del fatto che un numero viene decimale
> viene convertito per la memorizzazione in binario saltavano fuori con
> certi numeri cose simpatiche tipo: scrivevi 60.61 (precisione a 6
> decimali), andando a leggere il campo ti trovavi scritto 60.609999,
> mentre se scrivevi ad esempio scrivevi 60.62 continuavi a leggere 60.62.

Il problema dipende dal fatto che i computer, avendo memoria finita, non 
riescono a rappresentare tutti i numeri reali, che sono un insieme infinito, 
con solo 2^64 valori, che per quanto grosso è più piccolo di infinito. Quindi 
con un un numero in virgola mobile riesci solo a rappresentare un po' di 
numerini, ma che sono quelli che più o meno bastano a noi comuni mortali. 
Siccome 60.61 in quel set di numeri non c'è, il PC ti restituisce quello che è 
più vicino tra quelli che ha a disposizione, ad esempio 60.609999.

Per la matematica, chiedi a wikipedia:

http://it.wikipedia.org/wiki/Floating_point

> Quindi alla fine, si memorizzavano numeri su un campo a larghezza di 6
> decimali, ma alla fine al momento dell'output a video o per qualche
> calcolo (se necessario) si faceva e si fa l'arrotondamento a 5 decimali.
> Nel tuo caso, ti inviterei a memorizzare 3 decimali. Ah, non so i
> dettagli del tuo programma, ma ho a che fare spesso con tizi che
> memorizzano prezzi in euro con 3 o 4 decimali.

In questo caso immagino che vengano memorizzati 2 numeri interi, uno per la 
parte intera e uno per quella frazionaria. In questo modo ti eviti il problema 
di prima, ma sei limitato a numeri frazionari con un certo numero di decimali, 
che va bene per gli euro, ma andresti decisamente male a rappresentare cose 
come la carica di un elettrone, il numero di Avogadro o roba del genere.

Ciao
CD




More information about the montellug mailing list