Ik kwam een gek probleem tegen in m'n code. Logisch gezien moet het kloppen, maar dat deed het niet. Het kwam neer op deze hele simpele test.
Correct: 3 * 1.35 - 4.05 = 0
PHP 4+5 (Linux): 3 * 1.35 - 4.05 = 8.881784197E-16
PHP 4+5+6snapshot (Windows): 3 * 1.35 - 4.05 = 8.8817841970013E-016
Bij PHP.net zeggen ze dan:
De vraag is of ik PHP nog wel kan gebruiken voor bijv het genereren van facturen enzo, of moet ik soms overal bcmath functies gaan gebruiken?
PHP:
$var is een double van 1.35 en 3*1.35=4.05, oftewel de check is waar. Helaas denkt PHP daar anders over, 3*1.35 is geen 4.05 maar 4.05 en dan nog een heel klein beetje.1
2
3
4
| if ( 3 * $var == 4.05 ) { // doe iets } |
Correct: 3 * 1.35 - 4.05 = 0
PHP 4+5 (Linux): 3 * 1.35 - 4.05 = 8.881784197E-16
PHP 4+5+6snapshot (Windows): 3 * 1.35 - 4.05 = 8.8817841970013E-016
Bij PHP.net zeggen ze dan:
Oftewel, je weet nooit of berekeningen goed gaan. Dat PHP geen taal is voor grote floating point getallen kan ik me voorstellen, maar zulke simpele berekeningen zouden toch goed moeten gaan? Als zoiets simpels al fout kan gaan, kan ik dus geen enkele berekening met een float in mn code nog vertrouwen.Floating point values have a limited precision. Hence a value might not have the same string representation after any processing. That also includes writing a floating point value in your script and directly printing it without any mathematical operations.
If you would like to know more about "floats" and what IEEE 754 is read this: http://docs.sun.com/source/806-3568/ncg_goldberg.html
De vraag is of ik PHP nog wel kan gebruiken voor bijv het genereren van facturen enzo, of moet ik soms overal bcmath functies gaan gebruiken?