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

时间:2012-01-10 14:29:28

标签: php logic

任何人都可以解释为什么这段代码会对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';
}

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:1)

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

0.50000000000000022204

大于0.5

注意:上面使用Javascript评估,它使用所有数字的双精度数学:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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';