Edit report at https://bugs.php.net/bug.php?id=61108&edit=1
ID: 61108
User updated by: qphoria at gmail dot com
Reported by: qphoria at gmail dot com
Summary: string math with vast differential numbers yield
invalid math.
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:
Perhaps, but then why wouldn't the additional decimals show in the variable?
The initial string math should have returned:
20.22000003
if that was the case.
I would expect to see:
$x = 20.22
: double = 20.22
$y = ("10.10" + "10.12");
: double = 20.22000030
or
20.22e08 or something
Previous Comments:
------------------------------------------------------------------------
[2012-02-16 17:24:51] [email protected]
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.
.
------------------------------------------------------------------------
[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