PHP - 比较双字符串是很奇怪的?

时间:2011-05-19 17:38:43

标签: php string compare double

我在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 />';
?>

感谢。

5 个答案:

答案 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