在这个简单的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;
}
答案 0 :(得分:2)
大概是Type Juggling和PHP type comparison tables以及Comparison Operators。检查一下。
操作数1的类型:字符串,资源或编号
操作数2的类型:字符串,资源或编号
将字符串和资源转换为数字,通常的数学。
您可以通过向字符串添加类型转换来避免转换为浮动。
if((string)$floatval==$text){
$result_compare = true;
}else{
$result_compare = false; //php parser return false
}
答案 1 :(得分:0)
==将比较数据,使用===来比较数据和数据类型
答案 2 :(得分:0)
$floatval==$text
在上面的比较中,您将浮点值与字符串
进行比较尝试 === 而不是 ==
答案 3 :(得分:0)
看here。你永远不应该比较浮点数是否相等。
您需要使用epsilon技术。
例如:
if (abs($forstFloat - $secondFloat) < epsilon) {
echo 'they are equal!!'
}
其中epsilon
是常量,代表一个非常小的数字。
答案 4 :(得分:0)
$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;
}
?>
答案 5 :(得分:0)
试试这个,
$text="51.406ABC917";
$floatval = floatval($text);//51.406
if($floatval===$text){
$result_compare = 'true';//php parser return true
}else{
$result_compare = 'failed';
}
LOGIC:
$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.
参考:http://www.php.net/manual/en/language.operators.comparison.php
答案 6 :(得分:0)
在比较之前,$ text被转换为float,结果与floatval()相同, 然后你比较$ floatval == $ text,所以结果非常可预测 - TRUE
这是正常的,当您比较来自2种不同类型的变量时,首先将它们转换为最接近的相同类型。
我建议,在比较float时,使用类似的构造
if(abs($ floatval - floatval($ text))&lt; 0.001){..}
比较2个浮点数之间的差异,而不是它们。因为如果你有2个数字, 45 和 45.00001 ,php会认为它们不同。
你想要完成什么?为什么你认为这个结果是错的?
答案 7 :(得分:0)
试试这个:
<?php
$text="51.406ABC917";
$floatval = floatval($text);//51.406
if(strval($floatval)==$text){
$result_compare = true;//php parser return true
}else{
$result_compare = false;
}
?>
答案 8 :(得分:0)
如果字符串的第一部分是数字,它将被转换为数字,否则它将为零(0)。是的,要比较变量的值和类型,请使用===
代替==
。
但在你的情况下,你已经将字符串转换为floatval($text);
,然后===
与==
相同。
问题是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)
?>
此处的完整文档:http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion