Abs()-PHP中的绝对值函数问题



有人能解释一下为什么这段代码会对abs()(绝对值)这样做吗在我的代码中,它将显示"GREATER"——尽管0.50永远不会大于0.5,但我是否错过了abs功能?

$logic = abs(1.83333333333 - 2.33333333333);  // 0.50
$limit = 0.50;
if ($logic > $limit) {
    echo 'IS GREATER';
} else {
    echo 'IS NOT GREATER';
}

将浮点数传递给abs,您将得到一个浮点数。在这种情况下,您可能会遇到浮点表示的问题:浮点从来都不是绝对精确的,因此您很可能得到的数字不是0.50,而是0.500000…01。您可以尝试使用php round函数将结果四舍五入到所需的精度(在您的情况下,我猜是2)。

如果您不想按照@Aldo的答案进行舍入,并且您的服务器支持GMP数学函数,则可以使用gmp_abs()。这样就不会遇到PHP固有的浮点问题。

由于浮点数学的工作方式,您的绝对值$logic会产生以下值:

0.50000000000000022204

大于0.5

注意:以上使用Javascript进行评估,该脚本对所有数字使用双精度数学:

Math.abs(1.83333333333 - 2.33333333333).toFixed(20)

永远不要通过相等来比较浮点-使用epsilon技术而不是PHP:浮点数

define('EPSILON', 1.0e-8);
$logic = abs(1.83333333333 - 2.33333333333);  // 0.50
$limit = 0.50;
$diff = $logic - $limit;
if (abs($diff) < EPSILON)
   echo 'IS EQUAL';
else
   echo 'IS NOT EQUAL';

最新更新