PHP 中浮点数的比较。


在 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() 函数以正确的方式获得我们期望的结果。

更新于:2019-12-31

753 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.