Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么这个比较的结果是正确的_Php - Fatal编程技术网

Php 为什么这个比较的结果是正确的

Php 为什么这个比较的结果是正确的,php,Php,在这个简单的PHP代码中 为什么php解析器返回true $text="51.406ABC917"; $floatval = floatval($text);//51.406 if($floatval==$text){ $result_compare = true;//php parser return true }else{ $result_compare = false; } ==将比较数据,使用===比较数据和数据类型 $floatval==$text 在上面的比较中,您将浮点值与

在这个简单的PHP代码中 为什么php解析器返回true


$text="51.406ABC917";
$floatval = floatval($text);//51.406
if($floatval==$text){
$result_compare = true;//php parser return true
}else{
$result_compare = false;
}


==将比较数据,使用===比较数据和数据类型

$floatval==$text
在上面的比较中,您将浮点值与字符串进行比较

尝试使用==而不是=

外观。永远不要比较浮点数是否相等

你需要使用ε技术

例如:

if (abs($forstFloat - $secondFloat) < epsilon) { 
   echo 'they are equal!!'
if(abs($forstFloat-$secondFloat)
}

其中,
epsilon
是常数,表示一个非常小的数字

$a == $b Equal TRUE if $a is equal to $b after type juggling.
$a === $b Identical TRUE if $a is equal to $b, and they are of the same type.
以此为例,

<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true

switch ("a") {
case 0:
    echo "0";
    break;
case "a": // never reached because "a" is already matched with 0
    echo "a";
    break;
}
?>

试试这个

    $text="51.406ABC917";
    $floatval = floatval($text);//51.406
    if($floatval===$text){
        $result_compare = 'true';//php parser return true
    }else{
        $result_compare = 'failed';
    }
逻辑:

$a == $b    Equal   TRUE if $a is equal to $b after type juggling.
$a === $b   Identical   TRUE if $a is equal to $b, and they are of the same type.
参考:

  • 在比较之前,将$text转换为float,结果与floatval()相同, 然后比较$floatval==$text,所以结果是可以预测的-TRUE

    这很正常,当您比较两种不同类型的变量时,首先将它们转换为最接近的相同类型

  • 我建议,在比较float时,使用类似的构造

    if(abs($floatval-floatval($text))<0.001{..}

    比较两个浮点数之间的差异,而不是它们之间的差异。因为如果你有两个数字,4545.00001,php会认为它们不同

  • 你想完成什么?为什么你认为这个结果是错误的?

    是关于和,和。检查一下

    操作数1的类型:字符串、资源或数字
    操作数2的类型:字符串、资源或数字
    将字符串和资源转换为数字,通常是数学

    通过向字符串添加类型转换,可以避免转换为float

    if((string)$floatval==$text){
    $result_compare = true;
    }else{
    $result_compare = false; //php parser return false
    }
    
    试试这个:

    <?php
    $text="51.406ABC917";
    $floatval = floatval($text);//51.406
    if(strval($floatval)==$text){
        $result_compare = true;//php parser return true
    }else{
        $result_compare = false;
    }
    ?>
    

    如果字符串的第一部分是数字,它将被转换为数字,否则它将为零(0)。是,要比较变量的值和类型,请使用
    ==
    而不是
    =

    但在您的例子中,您已经通过
    floatval($text)将字符串转换为float然后
    ===
    ==
    相同

    问题是php如何通过
    floatval($text)将字符串转换为数字

    以下是php如何将字符串转换为数字:

    <?php
    $foo = 1 + "10.5";                // $foo is float (11.5)
    $foo = 1 + "-1.3e3";              // $foo is float (-1299)
    $foo = 1 + "bob-1.3e3";           // $foo is integer (1)
    $foo = 1 + "bob3";                // $foo is integer (1)
    $foo = 1 + "10 Small Pigs";       // $foo is integer (11)
    $foo = 4 + "10.2 Little Piggies"; // $foo is float (14.2)
    $foo = "10.0 pigs " + 1;          // $foo is float (11)
    $foo = "10.0 pigs " + 1.0;        // $foo is float (11)     
    ?>
    
    
    

    这里有完整的文档:

    PHP通过解析字符串直到找到第一个无效字符(对于浮点数),“如果将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都将转换为数字,并以数字方式执行比较。”还有一件事,永远不要相信,特别是在php中。如果他这样做了,每次我更改$text=“51.406ABC917”,他都会得到一个文件夹;至$text=“51.406917”;结果是假的,但我希望结果是真的;在这种情况下,使用
    if($floatval==$text){
    if($string)$floatval===(string)$text){