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