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

问题描述 投票:0回答:6

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

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

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

php compare floating-accuracy
6个回答
2
投票

($a - 0.2) === 0
评估为 false,因为
===
测试值和类型,并且
($a - 0.2)
具有浮点类型,但
0
具有整数类型。

如果将表达式更改为

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


1
投票

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

巧了,0.2就是这样的对偶无限浮点数...

0.2 decimal is 0.00110011001100110011 (repetend) binary

0
投票

使用此方法:

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

0
投票
if (abs($a-0.2) < PHP_FLOAT_EPSILON)

0
投票

只需将

( ($a - 0.2) === 0 )
更改为
($a === 0.2)
即可运行

<?php

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

您的

( ($a - 0.2) === 0 )
问题与不同类型有关,因为
($a - 0.2)
是浮点数,而 0 不是,所以这些可以是其他解决方案
修复类型问题(第一个解决方案)

<?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
投票
$a = 0.0000001;
var_dump($a <= 0 && $a >=0);
© www.soinside.com 2019 - 2024. All rights reserved.