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

Is there any way to compare float numbers correctly in PHP?

提问人:flashdebugger 提问时间:4/4/2021 更新时间:4/9/2021 访问量:1664

问:

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

$a = 0.2;
if ( ($a - 0.2) === 0 )
    return true;
else
    return false;

它返回 false。即使我尝试了 epsilon 常数,但有时它是不正确的。 有谁知道如何解决这个问题?

php 比较 浮动精度

评论

1赞 user3783243 4/4/2021
0是 int,因此类型不匹配。你可以这样做,或者使比较松散(对于 PHP >8,它也可以正确地处理字符串)。float(float)0

答:

0赞 LIGHT 4/4/2021 #1
if (abs($a-0.2) < PHP_FLOAT_EPSILON)

评论

1赞 flashdebugger 4/4/2021
我试过PHP_FLOAT_EPSILON,但有时有效,但不起作用。
0赞 Eric Postpischil 4/4/2021
这通常是错误的,因为固定值是错误的,因此按照此答案所示使用它时不考虑浮点值的比例。此外,没有用于比较包含舍入误差的浮点数的通用解决方案PHP_FLOAT_EPSILON
1赞 Honk der Hase 4/4/2021 #2

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

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

0.2 decimal is 0.00110011001100110011 (repetend) binary
2赞 Eric Postpischil 4/4/2021 #3

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

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

评论

1赞 jspit 4/5/2021
您应该在答案中添加注释,说明这仅适用于问题中的特定操作。通常,在操作后无法检查浮点值是否相等。示例:$a = 0.7;var_dump(($a - 0.2) == 0.5);//bool(false)
0赞 flashdebugger 4/6/2021
JSPIT 是对的
0赞 azibom 4/4/2021 #4

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

<?php

$a = 0.2;
if ($a === 0.2)
    return true;
else
    echo false;

您的问题与不同的类型有关,因为 is float 和 0 不是,所以这些可能是其他解决方案修复类型问题(第一个解决方案
( ($a - 0.2) === 0 )($a - 0.2)

<?php

$a = 0.2;
if (( ($a - 0.2) === 0.0 ))
    return true;
else
    return false;

修复类型问题(第二种解决方案)

<?php

$a = 0.2;
if (( ($a - 0.2) == 0 ))
    return true;
else
    return false;
0赞 Taylor Lee 4/9/2021 #5

使用此方法:

$a = 0.2;
if ( abs($a - 0.2) < 0.00001 )
    return true;
else
    return false;