在PHP中有没有办法正确比较浮点数?

在PHP中有没有办法正确比较浮点数?,php,compare,floating-accuracy,Php,Compare,Floating Accuracy,在PHP中,我愿意在一些操作之后比较浮点数,但它没有正确显示。 例如: $a = 0.2; if ( ($a - 0.2) === 0 ) return true; else return false; 它返回false。我甚至试过ε常数,但有时它是不正确的。 有人知道如何解决这个问题吗?if(abs($a-0.2)

在PHP中,我愿意在一些操作之后比较浮点数,但它没有正确显示。 例如:

$a = 0.2;
if ( ($a - 0.2) === 0 )
    return true;
else
    return false;
它返回false。我甚至试过ε常数,但有时它是不正确的。 有人知道如何解决这个问题吗?

if(abs($a-0.2)if (abs($a-0.2) < PHP_FLOAT_EPSILON)

由于四舍五入,您永远不应该比较浮点值是否相等。有些值在十进制中是有限的,在对偶系统中是无限的(反之亦然)

巧合的是,0.2是这样一个双无限浮点

0.2 decimal is 0.00110011001100110011 (repetend) binary
($a-0.2)===0
计算结果为false,因为
==
同时测试值和类型,并且
($a-0.2)
具有浮点类型,但
0
具有整数类型

如果将表达式更改为
($a-0.2)==0。
,则其计算结果将为true,因为值和类型将相同。如果将其更改为
($a-0.2)==0
,它将计算为true,因为值将相同,
=
只测试值。

只需将
($a-0.2)==0)
更改为
($a==0.2)
,然后它就可以工作了

使用此方法:

$a = 0.2;
if ( abs($a - 0.2) < 0.00001 )
    return true;
else
    return false;
$a=0.2;
if(绝对值($a-0.2)<0.00001)
返回true;
其他的
返回false;

0
是一个int,因此类型不匹配。您可以
float
it、
(float)0
,或者进行松散比较(对于PHP>8,它也可以使用字符串正常工作)。正如我所说,我尝试了PHP\u float\u EPSILON,但它有时工作,但不工作。这通常是错误的,因为
PHP\u float\u EPSILON
是一个固定值,因此,如本答案所示使用它并不考虑浮点值的比例。此外,您应该在回答中添加一条注释,说明这仅适用于问题中的特定操作。通常,操作后无法检查浮点值是否相等。例如:$a=0.7;var_dump($a-0.2)=0.5)//布尔(错)是对的,它成功了!非常感谢。