Il tipo di dati Float o Decimal deve essere utilizzato per importi in dollari?
La risposta è facile. Non galleggia mai. MAI !
I float erano secondo IEEE 754 sempre binari, solo il nuovo standard IEEE 754R definiva i formati decimali. Molte delle parti binarie frazionarie non possono mai eguagliare l'esatta rappresentazione decimale.
Qualsiasi numero binario può essere scritto come m/2^n
(m
, n
numeri interi positivi), qualsiasi numero decimale come m/(2^n*5^n)
.Poiché i binari mancano del factor 5
principale , tutti i numeri binari possono essere rappresentati esattamente da decimali, ma non viceversa.
0.3 = 3/(2^1 * 5^1) = 0.3
0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125]
1/4 1/8 1/16 1/32
Quindi finisci con un numero superiore o inferiore al numero decimale indicato. Sempre.
Perché importa? Arrotondamento.
L'arrotondamento normale significa 0..4 per difetto, 5..9 per aumento. Quindi fa importa se il risultato è o 0.049999999999
.... o 0.0500000000
... Potresti sapere che significa 5 cent, ma il computer non lo sa e arrotonda 0.4999
... down (sbagliato) e 0.5000
... in alto (a destra).
Dato che il risultato dei calcoli in virgola mobile contiene sempre piccoli termini di errore, la decisione è pura fortuna. Diventa senza speranza se si desidera una gestione decimale da arrotondamento a pari con numeri binari.
Poco convinta? Insisti sul fatto che nel tuo sistema di account sia tutto perfettamente ok? Attività e passività uguali? Ok, quindi prendi ciascuno dei numeri formattati dati di ciascuna voce, analizzali e sommali con un sistema decimale indipendente!
Confrontalo con la somma formattata. Oops, c'è qualcosa che non va, vero?
Per quel calcolo era richiesta estrema precisione e fedeltà (abbiamo usato Oracle'sFLOAT) in modo da poter registrare il "miliardesimo di centesimo" accumulato.
Non aiuta contro questo errore. Perché tutte le persone presumono automaticamente che il computer risponda correttamente e praticamente nessuno controlla in modo indipendente.