我在php中看到一些奇怪的行为,比较一个双字符串,并希望有人可以向我解释发生了什么。
如果我声明$ num = 0.333; 然后测试 $ num =='0.333', 这是真实的。如果我然后将1添加到$ num然后减去1,那么$ num =='0.333'将显示为false。如果我然后将$ num作为字符串进行转换,那么比较将恢复为真。为什么要这样做?
以下是一个示例:
<?php
$num = 0.333;
//returns 0.333 double Yes
echo $num, ' ', gettype($num), ' ', $num == '0.333' ? 'Yes' : 'No', '<br />';
$num += 1;
$num = $num - 1;
//returns 0.333 double No
echo $num, ' ', gettype($num), ' ', $num == '0.333' ? 'Yes' : 'No', '<br />';
$str = (string)$num;
//returns 0.333 string Yes
echo $str, ' ', gettype($str), ' ', $str == '0.333' ? 'Yes' : 'No', '<br />';
?>
感谢。
答案 0 :(得分:1)
为了比较PHP中的值和类型,您需要使用3“=”。喜欢:
$num = 333
$num === 333 => true
$num === '333' => false
有关详细信息,请参阅此处http://php.net/manual/en/language.operators.comparison.php
比较Float的一种可能方法是使用php.net评论中指出的关于floats的方法:
<?php
$number1=number_format($float1,2,'.','');
$number2=number_format($float2,2,'.''');
if($number1!=$number2){
echo 'do correction here!';
}
?>
但显然,没有明确的,最好的方法(或者我没有找到它)。有些人将float转换为String,另外一些是我刚写的代码。
如你所愿;)
答案 1 :(得分:1)
您正在比较浮点。
http://php.net/manual/en/language.types.float.php说:
永远不要比较浮点数是否相等。
==
比较值,但是'跨'类型:必须先转换其中一种类型才能进行实际比较。这将导致浮点变量的比较。这就是为什么在做一个看似平衡的动作(+1和-1)之后你会得到不同的结果。
答案 2 :(得分:0)
拿走点:使用===而不是==来避免类型强制。
原因是在第一个实例中$ num是一个double,但它也等于字符串'0.333'。
使用===表示双0.333与字符串'0.333'不同。
第二个已经做了一些补充,现在双倍不再是0.333,所以它与浮点不准确的字符串不一样。
第三个将0.333转换为字符串,当然与字符串相同。
答案 3 :(得分:0)
您正在比较拖尾数字有问题的浮点数。
有人认为你可以做的是将float转换为字符串并获取前x个字符(即如果你有一个字符串'.333',你要比较它,将float转换为字符串并取第一个字符串四个字符),或者你可以在将它浮动到正确的小数之前进行比较。
答案 4 :(得分:0)
比较两个浮动或双重使用http://php.net/manual/en/function.bccomp.php