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

问题描述

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

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

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

解决方法

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

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

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

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

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

0.2 decimal is 0.00110011001100110011 (repetend) binary
,

只需将 ( ($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;
,

使用这个方法:

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