Moet het gegevenstype Float of Decimal worden gebruikt voor bedragen in dollars?
Het antwoord is eenvoudig. Drijft nooit. NOOIT !
Floats waren volgens IEEE 754 altijd binair, alleen de nieuwe standaard IEEE 754R definieerde decimale formaten. Veel van de fractionele binaire delen kunnen nooit de exacte decimale representatie evenaren.
Elk binair getal kan worden geschreven als m/2^n
(m
, n
positieve gehele getallen), elk decimaal getal als m/(2^n*5^n)
.Omdat binaire bestanden de priemgetal factor 5
missen , alle binaire getallen kunnen exact worden weergegeven door decimalen, maar niet andersom.
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
U krijgt dus een getal dat hoger of lager is dan het opgegeven decimale getal. Altijd.
Waarom is dat belangrijk? Afronding.
Normale afronding betekent 0..4 naar beneden, 5..9 naar boven. Dus het doet maakt niet uit of het resultaat 0.049999999999
. is .... of 0.0500000000
... Je weet misschien dat het 5 cent betekent, maar de computer weet dat niet en rondt 0.4999
af ... omlaag (fout) en 0.5000
... omhoog (rechts).
Aangezien het resultaat van berekeningen met drijvende komma altijd kleine fouttermen bevat, is de beslissing puur geluk. Het wordt hopeloos als je decimaal van rond naar even wilt afhandelen met binaire getallen.
Niet overtuigd? U staat erop dat in uw rekeningsysteem alles perfect in orde is? Activa en passiva gelijk? Ok, neem dan elk van de gegeven opgemaakte getallen van elk item, ontleden ze en tel ze op met een onafhankelijk decimaal systeem!
Vergelijk dat met de opgemaakte som. Oeps, er is iets mis, nietwaar?
Voor die berekening was extreme nauwkeurigheid en betrouwbaarheid vereist (we gebruikten Oracle's FLOAT), zodat we konden registreren dat de "miljardste van een cent" nauwkeurig was.
Het helpt niet tegen deze fout. Want alle mensen gaan er automatisch van uit dat de computer goed optelt, en vrijwel niemand controleert zelfstandig.