float vs. decimal

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ozzie PHP

Ozzie PHP

31/05/2013 02:20:20
Quote Anchor link
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.
 
PHP hulp

PHP hulp

17/11/2024 19:32:53
 
Ward van der Put
Moderator

Ward van der Put

31/05/2013 10:29:47
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));

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
 
Ozzie PHP

Ozzie PHP

31/05/2013 14:30:21
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

31/05/2013 16:10:54
Quote Anchor link
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.
 
Kris Peeters

Kris Peeters

31/05/2013 16:42:29
Quote Anchor link
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.)
 
Ozzie PHP

Ozzie PHP

31/05/2013 18:02:08
Quote Anchor link
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?
 
Ward van der Put
Moderator

Ward van der Put

31/05/2013 18:30:15
Quote Anchor link
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 Lengte/Waarden.
Gewijzigd op 31/05/2013 18:30:53 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

31/05/2013 20:13:31
Quote Anchor link
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
 
Kris Peeters

Kris Peeters

03/06/2013 09:47:52
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

03/06/2013 11:22:14
Quote Anchor link
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.