奇怪的计算错误

时间:2013-04-29 22:57:34

标签: php

<?php
function neglogic($x,$y)
{
    if ($x<0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x<<0.0 &&  $y<<0.0 )
    {
        $p1=($x/$y);
    }
    if ($x==0.0 &&  $y>=0.0 )
    {
        $p1=("1");
    }
    elseif ($x==0.0 &&  $y<0.0 )
    {
        $p1=("0.05");
    }
    if ($x>0.0 && $y <=0.0)    
    { 
        $p1=("0.20");
    }
    elseif($x>0.0 && $y >0.0)
    {
        $q1=($x-$y);

        if ($q1>=0)
        {
            $p1=("0.20");
        }
        if ($q1<0)
        {
            $p1=("1.0");
        }
    }
    return $p1;
}
?>

这是它工作正常的脚本,但我注意到它在(-1到-0.001)之间的值失败。

请尝试下面的内容第二次(-.8,-2)失败,说$ pq未定义。

我知道我可以在开头定义$ p1,但我想知道为什么第二个数字失败了。

<?php
echo neglogic(-8,-2);
?>
<?php
echo neglogic(-0.8,-2);
?>

2 个答案:

答案 0 :(得分:2)

elseif ($x<<0.0 && $y<<0.0 )

“&LT;&LT;”并不意味着少于PHP。这意味着向左移动。

你的意思是左转0位吗?或者你的意思是测试低于<

http://www.php.net/manual/en/language.operators.bitwise.php

如果代码中包含"<<",则它是有效的代码,会导致意外行为。即一个bug。由于左移0位没有任何作用,if变为if($ x&amp;&amp; $ y),如果转换为boolean时x和y都为真,则为真。根据PHP文档,0和各种类似的值是错误的,其他一切都是真的。因此,只要x和y存在并且非零或两者都是“true”,就会执行bug之后的子句。特别是if子句可以在x或y为正时执行,因为正值为true,如果您认为测试的值小于0,那么这是非预期的行为。

http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

答案 1 :(得分:1)

此代码中有许多非常奇怪的样式,但跳出最多的是:

 elseif ($x<<0.0 &&  $y<<0.0 )

你真的是指<< - 这是按位左移运算符,并且由于它已经作为移位传递0然后它什么都没有。

您的意思是<,而不是比较吗?