PHP in_array 似乎不起作用

mic*_*cco 2 php arrays

我有两个文件:index.php 和 logspace.php。在 logspace.php 中,我有一个返回数组的函数 logspace。我从index.php 调用这个函数。然后我想检查这个返回的数组是否具有特定值,但“in_array”函数不起作用。

index.php 中的代码:

<?php
include 'logSpace.php';
$tmp=logspace(0.1,10,9);
$Tr=0.1;

if(in_array($Tr,$tmp))
{
    echo 'true';
}
else
{
    echo 'false';
}
?>
Run Code Online (Sandbox Code Playgroud)

即使值明显在数组中,我总是得到“假”:

var_dumb($Tr);

float(0.1)
Run Code Online (Sandbox Code Playgroud)

var_dump($tmp);

array(10) { [0]=> float(0.1) [1]=> float(0.16681005372001) [2]=> float(0.27825594022071) [3]=> float(0.46415888336128) [4]=> float(0.77426368268113) [5]=> float(1.2915496650149) [6]=> float(2.1544346900319) [7]=> float(3.5938136638046) [8]=> float(5.9948425031894) [9]=> float(10) }
Run Code Online (Sandbox Code Playgroud)

logSpace.php 中的代码

function logspace($start,$end,$num)
{
    $arr=array();
    $logMin=log($start);
    $logMax=log($end);
    $delta=($logMax-$logMin)/$num;
    $accDelta=0;

    for($i=0;$i<=$num;$i++)
    {
        $num_i=pow(M_E,$logMin+$accDelta);
        $arr[]=$num_i;
        $accDelta+=$delta;
    }        
return $arr;
}
?>
Run Code Online (Sandbox Code Playgroud)

Bri*_*n S 5

in_array将在某个时候测试相等性,但您的值是浮点数。由于精度有限,任何计算机语言中浮点数之间的相等充其量都是敏感的。

2 进制中的 1/10 通常与 10 进制中的 1/3 进行比较。您无法使用有限精度将 1/3 写为精确的小数(0.3333...),并且在计算机上使用 0.1 也会遇到同样的问题。解决方案是完全避免浮点数(将值存储为字符串、存储浮点数的整数倍、即时计算浮点数等),或者严格遵守不等式,而不是相等运算。

例如:

$epsilon = 0.00001;
$target_num = 0.1;

foreach ($tmp as $flt)
{
    if ($flt - $epsilon < $target_num && $target_num < $flt + $epsilon)
    {
        return true; // ~0.1 is in $tmp
    }
}
return false; // ~0.1 is not in $tmp
Run Code Online (Sandbox Code Playgroud)