Why does PHP convert a string with the letter E into a number?
PhpStringType ConversionString ComparisonPhp Problem Overview
Why does the following statement return true
?
"608E-4234" == "272E-3063"
I have also tried this with single quotes around the strings. The only way I can get it to evaulate to false
is by using the ===
operator instead of ==
My guess is PHP is treating it as some sort of equation but it seems a bit of a strange one.
Can anybody elaborate?
Php Solutions
Solution 1 - Php
"608E-4234"
is the float number format, so they will cast into number when they compares.
608E-4234
and 272E-3063
will both be float(0)
because they are too small.
For ==
in php,
> If you compare a number with a string or the comparison involves > numerical strings, then each string is converted to a number and the > comparison performed numerically.
http://php.net/manual/en/language.operators.comparison.php
Attention:
What about the behavior in javascript which also has both ==
and ===
?
The answer is the behavior is different from PHP. In javascript, if you compare two value with same type, ==
is just same as ===
, so type cast won't happen for compare with two same type values.
In javascript:
608E-4234 == 272E-3063 // true
608E-4234 == "272E-3063" // true
"608E-4234" == 272E-3063 // true
"608E-4234" == "272E-3063" // false (Note: this is different form PHP)
So in javascript, when you know the type of the result, you could use ==
instead of ===
to save one character.
For example, typeof
operator always returns a string, so you could just use
typeof foo == 'string'
instead of typeof foo === 'string'
with no harm.
Solution 2 - Php
PHP uses IEEE 754 for floats, and your numbers are so small that they evalue to 0.
See: http://en.wikipedia.org/wiki/IEEE_floating_point
Name Common name Base Digits E min E max
binary32 Single precision 2 23+1 −126 +127
binary64 Double precision 2 52+1 −1022 +1023
Solution 3 - Php
I think that PHP reads this as a scientific syntax, which will be translated as:
608 x 10^-4234 == 272 x 10^-3063
PHP interprets this as being 0 = 0
.
Solution 4 - Php
PHP is comparing those strings as floating point numbers, and they both are zero, so you MUST use the ===
operator,
Solution 5 - Php
I'm trying to answer. If you are using "===", you also check with the type instead of the value. If you are using "==", you just check the value is the same or not.
Solution 6 - Php
This is what it is seeing:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=<br>
http://www.wolframalpha.com/input/?i=272E-3063
As they don't fit into the variable, they both equate to 0, or whatever default value php chooses, and therefore are equivalent.
Solution 7 - Php
Other answers have noted this, but the PHP manual has made this explicit now. PHP sees any string with an E
bounded by numbers as scientific notation
> EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
As you can see, this is case insensitive (E
or e
). Where this becomes a gotcha is in weak type string comparisons
var_dump("2E1" == "020"); // true
2E1
is really 2 * (10 ^ 1)
, and that works out to 20. Insert any other letter there and it will return the expected false
. From the question
"608E-4234" == "272E-3063"
That works out to
608 * (10 ^ -4234) == 272 * (10 ^ -3063)
Neither number can be represented by PHP (as JvdBerg noted), so they are converted to 0