[英]PHP in_array does not seem to work
我有兩個文件:index.php 和 logspace.php。 在 logspace.php 我有一個返回數組的 function 日志空間。 我從 index.php 中將其稱為 function。 然后我想檢查這個返回的數組是否有一定的值,但 'in_array' function 不起作用。
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';
}
?>
即使值顯然在數組中,我總是得到“假”:
var_dumb($Tr);
float(0.1)
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) }
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;
}
?>
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.