Optel'fout' PHP/SQL
Het is eigenlijk al een tijdje dat ik ermee zit, maar ik kan geen verklaring/oplossing vinden, en het wordt inmiddels best wel vervelend.
Als ik strings bij elkaar optel, bijv. 4.95+4.99+-9.94 krijg ik géén 0 als antwoord, in plaats daarvan een gigantisch klein getal (dat ge'echo'ed wordt als 0.00001E-36ste o.d.. Echter klopt het wel gewoon lijkt me.
Wat kan ik doen om wel goed te rekenen? Volgens mij komt het alleen voor bij getallen die negatief zijn, en dan naar positief omgerekend. Zowel bij SQL SUM() als PHP.
Als ik strings bij elkaar optel, bijv. 4.95+4.99+-9.94 krijg ik géén 0 als antwoord, in plaats daarvan een gigantisch klein getal (dat ge'echo'ed wordt als 0.00001E-36ste o.d.. Echter klopt het wel gewoon lijkt me.
Wat kan ik doen om wel goed te rekenen? Volgens mij komt het alleen voor bij getallen die negatief zijn, en dan naar positief omgerekend. Zowel bij SQL SUM() als PHP.
Gesponsorde koppelingen:
+- operator veranderen in een fatsoenlijke syntax.
Jaron T op 11/11/2010 18:11:00:
+- operator veranderen in een fatsoenlijke syntax.
Vriend. Dat is gewoon wiskunde. Waar baseer je je geblaat op?
Code (php)
1
2
3
4
2
3
4
niek@niek-desktop:/$ php -r "echo (4.95+4.99+-9.94).PHP_EOL;"
1.7763568394003E-15
niek@niek-desktop:/$ php -r "echo (4.95+4.99-9.94).PHP_EOL;"
1.7763568394003E-15
1.7763568394003E-15
niek@niek-desktop:/$ php -r "echo (4.95+4.99-9.94).PHP_EOL;"
1.7763568394003E-15
Ontopic:
Er gaat iets fout in het rekenen met floats. Floats falen namelijk soms nogal op precisie.
Gaat het om geld? In dat geval is de oplossing misschien 'vies', maar makkelijk:
Gewijzigd op 11/11/2010 21:10:16 door niek s
Mocht het om geld gaan of om iets anders waarbij precisie noodzakelijk is: bcmatch
Het gaat inderdaad om geld, het is een opzet voor een boekhoudprogramma. Maar ik heb inmiddels berekend dat het bij grote hoeveelheden op gegeven moment zelfs om een paar cent verschil gaat, en dat is echt niet de bedoeling.
Is er een mooiere manier? Of is het beter om floats te omzeilen door bedragen in centen op te slaan? (dus bijv. 100 = 1,00 euro?)
Is er een mooiere manier? Of is het beter om floats te omzeilen door bedragen in centen op te slaan? (dus bijv. 100 = 1,00 euro?)
EDIT: het gaat dus wel, ik zag de link van Pim iets te laat. Het is wel wat beperkt zo te zien.
Ik zou voor de centen gaan. Het kan zijn dat ik ergens overheen kijk maar ik krijg met array_sum() nog niet eens een goede uitkomst en daar staan de opperators dus los van.
En op php.net staat een waarschuwing over de precisie. http://php.net/manual/en/language.types.float.php
liever 1 keer een functie schrijven voor de weergave dan elke keer lopen te rotzooien bij berekeningen lijkt me.
Ik zou voor de centen gaan. Het kan zijn dat ik ergens overheen kijk maar ik krijg met array_sum() nog niet eens een goede uitkomst en daar staan de opperators dus los van.
En op php.net staat een waarschuwing over de precisie. http://php.net/manual/en/language.types.float.php
liever 1 keer een functie schrijven voor de weergave dan elke keer lopen te rotzooien bij berekeningen lijkt me.
Gewijzigd op 11/11/2010 22:08:34 door - Mark -



