Versio

Optel'fout' PHP/SQL

Overzicht Reageren

Martijn Verhoef

Martijn Verhoef

11/11/2010 17:58:13
Quote Anchor link
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.
 
PHP hulp

PHP hulp

25/05/2012 13:21:37
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Jaron T

Jaron T

11/11/2010 18:11:00
Quote Anchor link
+- operator veranderen in een fatsoenlijke syntax.
 
Niek s

niek s

11/11/2010 21:08:32
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
niek@niek-desktop:/$ php -r "echo round(4.95+4.99+-9.94, 2).PHP_EOL;"
0
Gewijzigd op 11/11/2010 21:10:16 door niek s
 
Pim -

Pim -

11/11/2010 21:15:29
Quote Anchor link
Mocht het om geld gaan of om iets anders waarbij precisie noodzakelijk is: bcmatch
 
Martijn Verhoef

Martijn Verhoef

11/11/2010 21:36:05
Quote Anchor link
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?)
 
- Mark -

- Mark -

11/11/2010 22:00:39
Quote Anchor link
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.
Gewijzigd op 11/11/2010 22:08:34 door - Mark -
 



Overzicht Reageren