2014-03-05 32 views
2

为什么在STRING比较中0等于0.0?比较搞乱零的PHP字符串数字

<?php 
    isset($_GET['temp'])?$temp=$_GET['temp']:$temp=0; 
    if($temp == 0) { 
     if ((string) $_GET['temp']==(string) '0.0'){ 
      $temp=0.01; 
      print '='.$_GET['temp'].'='; 
     }else{ 
      print '-'.$_GET['temp'].'-'; 
     } 
    }else{ 
     print '+'.$_GET['temp'].'+'; 
    } 
    print $temp; 
?> 

印刷值为:

?temp=1 +1+1   (as expected) 
?temp=0.0 =0.0=0.01 (as expected) 
?temp=z -z-z   (as expected) 
?temp=0 =0=0.01  Wait...WHAT??? 

我在哪里搞乱?我敢肯定,它是我的错,我只是不想看到... 我试了一下没有typejuggling也,同样的结果...

编辑:
尝试http://test.youp.net/stringcomparetest.php?temp=0进行测试,实际的源代码显示那里。

+0

你说你“试了一下没有typejuggling也” - 但使用字符串投(即'(串)'。)不避“式的杂耍” - 在你的例子他们已经是字符串,所以在这种情况下类型转换是多余的。 – MrWhite

+0

@ w3d:thas正确,但因为它没有给我我期待的结果,所以我尝试了铸造以及无结果:) – ExploWare

回答

1

为什么在STRING比较中0等于0.0?

因为数值字符串(即满足is_numeric())首先转换为数字并进行数值比较。您需要使用身份运算符(===)来比较类型。

参考:PHP Comarison Operators

+0

谢谢!当我第一次将它引入到PHP中时,我曾经这样做过,但我忘了它的一切。我在我的examplepage(http://test.youp.net/stringcomparetest.php?temp=0)中的代码中添加了此更正以供将来参考 – ExploWare

+0

您也可以使用PHP的[strcmp()](http:// www。 php.net/manual/en/function.strcmp.php)函数如果你想强制字符串比较 - 这可能比'==='更容易阅读。 – MrWhite