Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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浮点循环与值不匹配_Php - Fatal编程技术网

PHP浮点循环与值不匹配

PHP浮点循环与值不匹配,php,Php,我有一个最奇怪的虫子,我就是搞不懂 我循环遍历值并检查它们是否等于浮点 奇怪的是,它对某些价值观很有效,但对另一些价值观却不起作用,这让我的大脑融化了。 当我直接比较时,它“匹配”,但当在循环中创建$num1时,它不再喜欢它了 例如,0.1和0.2都返回匹配项,但0.3不返回匹配项 $num1 = 0.3; $num2 = 0.3; var_dump($num1); var_dump($num2); if ($num1 == $num2) { echo "*** MATCH

我有一个最奇怪的虫子,我就是搞不懂

我循环遍历值并检查它们是否等于浮点

奇怪的是,它对某些价值观很有效,但对另一些价值观却不起作用,这让我的大脑融化了。 当我直接比较时,它“匹配”,但当在循环中创建$num1时,它不再喜欢它了

例如,0.1和0.2都返回匹配项,但0.3不返回匹配项

$num1 = 0.3;
$num2 = 0.3;

var_dump($num1);
var_dump($num2);

if ($num1 == $num2) {
    echo "*** MATCH ***<br>";
} else {
    echo "NO MATCH<br>";
}

echo "<hr>";

for ($num1=0; $num1 < 0.6; $num1 = $num1 + 0.1) {
var_dump($num1);
var_dump($num2);


if ($num1 == $num2) {
    echo "*** MATCH ***<br>";
} else {
    echo "NO MATCH<br>";
}

echo "<hr>";
}
例如,如果我将$nums更改为0.2,那么它就可以工作了

float(0.2) float(0.2) *** MATCH ***
int(0) float(0.2) NO MATCH
float(0.1) float(0.2) NO MATCH
float(0.2) float(0.2) *** MATCH ***
float(0.3) float(0.2) NO MATCH
float(0.4) float(0.2) NO MATCH
float(0.5) float(0.2) NO MATCH
我不知所措

其他人是否可以运行此代码以查看是否得到相同的结果

提前谢谢


TempPeck

我已将PHP转换为JS,这可能有助于将问题可视化:

设num1=0.3;
设num2=0.3;
如果(num1==num2){
log(`num1:${num1}num2:${num2}***匹配***`);
}否则{
log(`num1:${num1}num2:${num2}不匹配`);
}
对于(num1=0;num1<0.6;num1+=0.1){
如果(num1==num2){
log(`num1:${num1}num2:${num2}***匹配***`);
}否则{
log(`num1:${num1}num2:${num2}不匹配`);
}

}
这是众所周知的浮点数及其存储方式问题。特别好,因为它有助于形象化问题。从本质上讲,浮点数是不精确的,因为0.3实际上可能是0.29999999999999993654或3.0000000000000000000001284(这不是实际值,只是问题的一个例子)。比较两者并不像使用
==
那么容易,谢谢Martin的帮助。我可以通过格式化数字$num1=number_格式($num1,1,'.'','')来“修复”它;可能并不完美,但它似乎起了作用。我很高兴你已经设法解决了这个问题——使用这种方法肯定会帮助解决这个问题。我已经添加了一个答案,在JS中显示了上面的内容,如果有帮助的话,可以在站点上运行该答案来可视化问题。
float(0.2) float(0.2) *** MATCH ***
int(0) float(0.2) NO MATCH
float(0.1) float(0.2) NO MATCH
float(0.2) float(0.2) *** MATCH ***
float(0.3) float(0.2) NO MATCH
float(0.4) float(0.2) NO MATCH
float(0.5) float(0.2) NO MATCH