PHP 中浮点值的比较。\

phpserver side programmingprogramming更新于 2024/9/8 13:52:00

在 PHP 中,测试浮点值的相等性是有问题的,因为 PHP 在检查一个浮点数是否等于另一个浮点数时会失败。尽管浮点数似乎具有相同的值,但实际上并不需要相同。因此,本文将演示我们在比较浮点数时面临的问题以及避免此问题的不同程序。

示例

让我们用一个简单的例子来测试一下:

<?php
   $a = 0.14;
   $b = 1 - 0.86; //0.14
   if($a == $b ){
      echo 'a and b are same';
   }
   else {
      echo 'a and b are not same';
   }
?>

输出:

a and b are not same.

说明:

此代码中,虽然 $a 和 $b 相同,但执行的是 else 条件而不是 if 条件。这是由于浮点值的特性,它们在内部的表示方式不同。让我们讨论一下 PHP 中的不同情况,以实时避免此问题。

案例 1:

使用计算机系统中计算的最小差异来演示浮点值的比较。

示例:

<?php
   $val1 = 2.183459;
   $val2 = 2.183450;
   $epsilon = 0.00001;
   if(abs($val1 - $val2) < $epsilon) {
      echo "True";
   }
   else {
      echo &"False&";
   }
?>

输出:

True

解释:

这里我们使用两个浮点变量 val1 和 val2 以及 epsilon。然后我们利用名为 abs() 的本机函数取变量(val1 和 val2)的绝对差。此代码将为我们提供绝对值,但问题是我们为什么要取绝对值?答案是,我们可以看到两个值的小数点后位数相同,精度值最高为 5,这对于 PHP 分析比较来说很困难。

案例 2:

使用 round() 函数。

<?php
   $val1 = 9 - 6.2;
   $val2 = 1.8;
   var_dump(round($val1, 2) == round($val2, 2));
?>

输出:

bool(true)

说明:

这里我们使用两个浮点变量 val1 和 val2。然后我们使用预定义函数 round (),该函数将浮点值四舍五入到小数点后两位,然后进行比较。这里我们使用预定义的 round() 函数以正确的方式获得预期结果。


相关文章