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
说明:
在这里,我们在epsilon旁边使用两个浮点变量val1和val2。然后,我们利用名为的本机函数获取变量(val1和val2)的绝对差abs()
。该代码将为我们提供绝对值,但问题是为什么我们要采用绝对值?答案是,我们可以看到两个值在十进制后直到精度值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()
函数以正确的方式获得期望的结果。