Edit report at https://bugs.php.net/bug.php?id=61108&edit=1
ID: 61108 Updated by: ras...@php.net Reported by: qphoria at gmail dot com Summary: string math with vast differential numbers yield invalid math. -Status: Open +Status: Not a bug Type: Bug Package: Math related Operating System: Windows/Linux PHP Version: 5.3.10 Block user comment: N Private report: N New Comment: 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://www.floating-point-gui.de/ Thank you for your interest in PHP. . Previous Comments: ------------------------------------------------------------------------ [2012-02-16 17:18:05] qphoria at gmail dot com Description: ------------ Tried this on the latest 5.3.10 and also on 5.2.17 It is a bit difficult to put into words, but math with varying string-number sizes calculates wrong. Simply put: THIS IS CORRECT: ----------------- $x = 20.22 : double = 20.22 $y = ("10.10" + "10.12"); : double = 20.22 $x == $y : bool = TRUE THIS IS BUGGED: ------------------- $x = 20.22 : double = 20.22 $y = ("19.10" + "1.12"); //20.22 : double = 20.22 $x == $y : bool = FALSE For some reason, if you have a wide number spread in the string math, the boolean fails, even though they are both shown as float/double numbers The simple fix is to wrap round() around the string math. Can't really explain it. Test script: --------------- <?php $x = 23.36; $y = ("21.42" + "1.94"); if ($x < $y) { echo "math fail<br/>"; } else { echo "math win<br/>"; } var_dump($x, $y); echo "<br/>"; $x = 23.36; $y = ("10.36" + "13.00"); if ($x < $y) { echo "math fail<br/>"; } else { echo "math win<br/>"; } var_dump($x, $y); ?> Expected result: ---------------- I expect to see: math win float(23.36) float(23.36) math win float(23.36) float(23.36) Actual result: -------------- What I really see is: math fail float(23.36) float(23.36) math win float(23.36) float(23.36) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=61108&edit=1