Why does PHP convert a string with the letter E into a number?

PhpStringType ConversionString Comparison

Php 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+1126	+127		
binary64	Double precision    	2	52+11022	+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.

you can reference to here and here.

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAndyView Question on Stackoverflow
Solution 1 - PhpxdazzView Answer on Stackoverflow
Solution 2 - PhpJvdBergView Answer on Stackoverflow
Solution 3 - PhpMihai MateiView Answer on Stackoverflow
Solution 4 - PhpMatteo TassinariView Answer on Stackoverflow
Solution 5 - PhpAlfred AngkasaView Answer on Stackoverflow
Solution 6 - PhpJoeboneView Answer on Stackoverflow
Solution 7 - PhpMachavityView Answer on Stackoverflow