float vs. decimal
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.
Vrij naar What Every Computer Scientist Should Know About Floating-Point Arithmetic kun je het zo reproduceren in MySQL:
Code (php)
1
2
3
4
5
2
3
4
5
-- 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));
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.
Gewijzigd op 31/05/2013 10:31:19 door Ward van der Put
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.
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.
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.)
@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?
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 Lengte/Waarden.
Gewijzigd op 31/05/2013 18:30:53 door Ward van der Put
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?
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.