Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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-将double与字符串进行比较很奇怪吗?_Php_String_Compare_Double - Fatal编程技术网

PHP-将double与字符串进行比较很奇怪吗?

PHP-将double与字符串进行比较很奇怪吗?,php,string,compare,double,Php,String,Compare,Double,我在php中看到了一些奇怪的行为,当比较双精度和字符串时,我希望有人能向我解释到底发生了什么 如果我声明$num=0.333; 然后测试 $num==“0.333”, 事实证明这是真的。如果我在$num上加1,然后减去1,那么$num=='0.333'将显示为false。如果然后将$num转换为字符串,则比较返回为true。为什么要这样做 以下是一个示例: <?php $num = 0.333; //returns 0.333 double Yes echo $num, '

我在php中看到了一些奇怪的行为,当比较双精度和字符串时,我希望有人能向我解释到底发生了什么

如果我声明$num=0.333; 然后测试 $num==“0.333”, 事实证明这是真的。如果我在$num上加1,然后减去1,那么$num=='0.333'将显示为false。如果然后将$num转换为字符串,则比较返回为true。为什么要这样做

以下是一个示例:

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


谢谢。

要在PHP中比较值和类型,需要使用3“=”。比如:

请参阅此处了解更多详细信息

比较Float的一种可能方法是使用php.net中关于以下内容的注释中指出的方法:


但显然,没有一个明确的、最好的方法来做(或者我没有找到)。有些人将浮点值转换为字符串,另一些人执行我刚刚编写的代码


随你的便;)

您正在比较一个浮点

说:

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


=
比较值,但“跨”类型:必须先转换其中一种类型,然后才能实际比较。这将导致浮点变量的比较。这就是为什么在执行看似平衡的操作(+1和-1)后,您会得到不同的结果。

要点:使用===代替==以避免类型强制

原因是在第一个实例中,$num是双精度的,但它也等于字符串“0.333”

使用===表示双精度0.333与字符串“0.333”不同

第二个已经做了一些加法,现在double不再是精确的0.333,所以它与字符串到浮点的不精确性不同


第三个将0.333强制转换为字符串,这当然与字符串相同。

您正在比较尾随数字有问题的浮点


你可以做的一件事是将浮点值转换为字符串,然后取前x个字符(即如果你有一个字符串“.333”,则将浮点值转换为字符串,然后取前四个字符),或者你可以在比较之前将浮点值转换为适当的小数。

要比较两个浮点值或双精度使用,你是对的,比较浮动和字符串是很奇怪的;)是的,你为什么要这样做?…我必须把一些数字加在一起,然后把小数部分转换成一个分数,如果它是一个普通的分数。这里我加了1.333和-1,分数转换会进行字符串比较。在进行字符串比较之前,我现在将其转换为字符串,以“修复”该问题,但我很好奇为什么会发生这种情况。您应该注意
$num===0.333
。正如手册所说,不要将等式与浮点数进行比较……虽然这是事实,但我认为这实际上并不能解决@bachs的任何问题:DNow,它应该更准确;)为了阐明这一点,请注意
var_dump($str-$num)
的结果,在我的系统中,它的计算结果为“float(5.5511151231258E-17)”。有关更多信息,请参阅。谢谢。这完全有道理。在第二种情况下,除了gettype()会返回'float'而不是'double'之外,还有其他函数可以使用吗?啊,我明白了,这是有道理的。那么为什么gettype()返回“double”呢?正如我所理解的,在第一次比较中,在将1添加到$num之前,$num是double,但是加法和减法将其转换为float?不,double是浮点类型,就像“float”一样,但是还有更多的“数字”:DThanks。那么,在第二种情况下,gettype($num)不应该返回“float”吗?double是精度更高的float。
$num = 333
$num === 333 => true
$num === '333' => false
<?php 
$number1=number_format($float1,2,'.',''); 
$number2=number_format($float2,2,'.'''); 
if($number1!=$number2){ 
 echo 'do correction here!'; 
} 
?>