提问人:flashdebugger 提问时间:4/4/2021 更新时间:4/9/2021 访问量:1664
有没有办法在 PHP 中正确比较浮点数?
Is there any way to compare float numbers correctly in PHP?
问:
在PHP中,我愿意在一些操作后比较浮点数,但它没有正确显示。 例如:
$a = 0.2;
if ( ($a - 0.2) === 0 )
return true;
else
return false;
它返回 false。即使我尝试了 epsilon 常数,但有时它是不正确的。 有谁知道如何解决这个问题?
答:
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;
评论
0
是 int,因此类型不匹配。你可以这样做,或者使比较松散(对于 PHP >8,它也可以正确地处理字符串)。float
(float)0