Ola,

Mijn database class kan inmiddels prima werken met de meest voorkomende datatypes: integer, string, boolean en null.

Ik bedacht me ineens dat ik natuurlijk ook getallen met een komma moet kunnen toevoegen, ofwel floats.

Nu zat ik even wat te lezen over het MySQL datatype FLOAT, en las ik op diverse plekken dat je beter niet het datatype FLOAT kunt gebruiken, maar in plaats daarvan DECIMAL.

Ik kom er zelf niet echt achter wat nou het verschil is tussen FLOAT en DECIMAL en wanneer (in welke situaties) je wat moet gebruiken.

Kan iemand dit uitleggen en misschien een paar voorbeeldjes geven?

Hartelijk dank alvast.
Met DECIMAL voorkom je afrondingsfouten die bij FLOAT optreden. Door schade en schande wordt men wijs: ik heb dat vroeger wel eens met bedragen gehad. Dan krijg je af en toe net 1 cent te veel of te weinig...

Vrij naar What Every Computer Scientist Should Know About Floating-Point Arithmetic kun je het zo reproduceren in MySQL:


-- Antwoord is 0.20
SELECT (1.01 * 10) - (0.99 * 10);

-- Antwoord is 0.199999999999999
SELECT (1.01 * POWER(10, 1)) - (0.99 * POWER(10, 1));

10 tot de macht 1 is gewoon 10, maar de tweede uitkomst bevat een afrondingsfout.
Ward dankjewel voor je reactie. Maar als ik het goed begrijp moet ik dus altijd DECIMAL gebruiken en nooit FLOAT?

Ik ben niet zo wiskundig onderlegd, en het gaat mij er vooral om of ik in de praktijk ooit FLOAT zal nodig hebben (en zo ja waarvoor), of dat ik juist beter gewoon altijd DECIMAL kan gebruiken.
Het is ergens een nog algemenere regel: gebruik altijd een zo klein mogelijke dataruimte. Dus ook geen DECIMAL als het met een integer kan. En vervolgens bijvoorbeeld ook liever een SMALLINT dan een MEDIUMINT.

Kijk verder ook eens naar hoe iDEAL wordt geïmplementeerd: geen bedragen in euro's, maar in centen. Daardoor zijn geen floatoperaties nodig en heb je geen gedoe met punten en komma's.

Oh ja, en geen millenniumprobleem inbouwen door 2013 op te slaan als 13. Je kunt ook té ver gaan.
Float kan je gebruiken voor berekeningen; statistieken en zo. Getallen die continu* mogen zijn.

Ik zeg maar wat; berekenen van de verdeling van het gewicht van iedereen in de klas (of bureau). Daar de mediaan, modulus (en zo) berekenen; Gauss-curve opstellen ...
Of de snelheid van een marathon, voor een bepaalde groep mensen.

Dat zal nooit toevallig op 0.1999999 komen. De afronding die gebeurt, stoort niet, en kan zelfs relevant zijn.

(* continu, dus geen vaste step tussen twee getallen. Gelijk welke waarde kan mogelijk zijn.)
Dankjewel voor jullie reacties.

@Ward: ik weet dat je inderdaad een zo klein mogelijke dataruimte moet kiezen. Dat van die bedragen in centen vind ik wel interessant. Is het gebruikelijk om bedragen in centen op te slaan?

@Kris: met continu bedoel je dan dat het getal "alles" kan zijn, terwijl bij decimals je bijv. maar 1 getal achter de komma kunt hebben, bijv. 8,1 8,2 8,3 enz. ? Begrijp ik het zo goed? Terwijl een float 8,2335453246553 kan zijn?

Oh ja, hoe kan je bij een DECIMAL dan (in PHPMyAdmin) het aantal cijfers achter de komma aangeven?
Bij transacties tussen betaalsystemen worden inderdaad vaak integers gebruikt, terwijl de meeste e-commercesystemen DECIMAL gebruiken met 2 tot 4 cijfers achter de komma. Ergens wel logisch: voor één euro de integer 100 doorgeven in eurocenten is eenvoudiger dan 1.00 (of 1,00 met een komma en wat hadden we daarover ook alweer geformaliseerd). Voor de rest is het vooral de macht der gewoonte, denk ik.

DECIMAL declareer je met twee integers, bijvoorbeeld DECIMAL(6, 2) voor 6 posities met 2 cijfers achter de komma. In phpMyAdmin kun je hiervoor dan 6,2 opgeven bij [b]Lengte/Waarden[b].
Ah oké, dankjewel Ward. Weer wat geleerd vandaag :)

Toevoeging op 31/05/2013 23:19:43:

Ah oke... even getest en het werkt, waarbij ik opmerk dat 6,2 wil zeggen dat het maximaal aantal cijfers 6 is, waarvan er 2 cijfers achter de komma zijn. Maximaal kan dus een aantal worden ingevoerd van 9999,99 (6 cijfers in totaal waarvan 2 achter de komma).

Voorbeeldjes:

4 wordt 4.00
123.56789 wordt 123.57
123456.123456 wordt 9999.99
Ozzie PHP op 31/05/2013 18:02:08

@Kris: met continu bedoel je dan dat het getal "alles" kan zijn, terwijl bij decimals je bijv. maar 1 getal achter de komma kunt hebben, bijv. 8,1 8,2 8,3 enz. ? Begrijp ik het zo goed? Terwijl een float 8,2335453246553 kan zijn?

Oh ja, hoe kan je bij een DECIMAL dan (in PHPMyAdmin) het aantal cijfers achter de komma aangeven?


Ja, zo ongeveer.
Noteer ook:

Float staat voor "floating point", ofwel beweegbare komma.
Dus, zoals dat getal wordt gecodeerd in het geheugen, is een groot deel getal, en een klein deel "waar komt de komma?".

Dus niet het aantal cijfers na de komma, maar het aantal beduidende cijfers bepaalt de precisie.

dus bv. 86532169 => 8 beduidende cijfers
Dan kan dat worden
86.532169 of 8653216900000 of 0.00086532169
Dat neemt allemaal even veel geheugen in; dat heeft allemaal de zelfde precisie.


Ah, ik ging er altijd gewoon vanuit dat een float een getal met komma's was. Dit is nieuw voor mij. Dankjewel voor deze toevoeging Kris. Of ik het ooit nodig zal hebben weet ik niet, maar wel interessant om te weten hoe het werkt.

Reageren