为什么NA​​N在PHP中不等于除了true之外的所有内容?

时间:2011-04-01 03:29:51

标签: php floating-point

在PHP中,NAN将false与0"0"falsearray()array(1)NAN进行比较, null基本上我能辨别的所有其他类变量。

NAN == true会返回true。为什么NAN == true会返回true

5 个答案:

答案 0 :(得分:9)

在php中,$x == true$x? true : false相同。也就是说,将true==进行比较而不是===,则意味着$x将在布尔上下文中评估为true。

如果在布尔上下文中将NAN评估为false,则NAN == false将评估为true。

答案 1 :(得分:6)

NAN(相当NAN或信令NAN)是非零浮点值。 *这就是为什么*

sqrt(-1.0) -> NAN

有-NAN和+ NAN虽然大约有80286,但它通常在测试中被认为是NAN。

如果需要,请检查FPU浮点指令集。

+ INF和-INF也是非零浮点值:

- log(0.0) -> +INF
log(0.0) -> -INF

这是英特尔浮点堆栈的转储。我只列出我正在谈论的几个值:(不要忘记,内部,FPU是10个字节):

     <exp>  <mantissa>
0.0  00 00 00 00 00 00 00 00 00 00
-INF FF FF 80 00 00 00 00 00 00 00
+INF 7F FF 80 00 00 00 00 00 00 00
-NAN FF FF C0 00 00 00 00 00 00 00
+NAN 7F FF C0 00 00 00 00 00 00 00

你可以看到,只有0.0是零!

答案 2 :(得分:3)

出于同样的原因is_numeric(NAN)返回true

答案 3 :(得分:1)

我认为他们在更高版本的PHP中修复了它。 我使用5.2而NAN实际上等于false。

这是我的代码

<?php
var_dump(PHP_VERSION); //string(6) "5.2.17"
if(NAN == false)
{
    echo "false";
}

if(NAN == true)
{
    echo "true";
}
//This only print out "false".
?>

答案 4 :(得分:0)

==运算符的含义是“类型杂耍后操作数相等”(与===相对,这意味着“操作数相等且类型相同”)。你可以查找确切的(而且是任意的)规则in the manual,但是当其中一个操作数是数字时,类型juggling可以采用三种形式:

  1. 另一个操作数是布尔值或null - &gt;双方都转换为布尔值并进行比较
  2. 另一个操作数是一个数组或一个对象 - &gt;永远不平等,不做类型杂耍
  3. 另一个操作数是字符串,数字或资源 - &gt;它被转换为数字并进行比较
  4. 因此,在第2种情况下,结果在定义中为假,在3.中它是假的,因为NAN以任何方式与任何数值进行比较都是假的,并且在1.中NAN被转换为boolean,这是真的({{ 3}},但基本上除了零/空/空之外的任何东西都是真的),所以如果另一方也是真的那么比较将是真的。