1

在将值浮点数和整数相除后,我遇到了 PHP 比较问题。

这是我的代码:

<?php

    function test_promo($price) {
        $tmpprice = $price*100;
        $divprice = $tmpprice/intval($tmpprice);
        if ( $divprice > 1 ) {
            echo "$price = TRUE\n";
            //TODO do something >1
        }
        else {
            echo "$price = FALSE\n";
            //TODO do something <=1
        }
    }

    echo "<pre>";
    test_promo(2.41);   //output--> 2.41 = FALSE
    test_promo(2.42);   //output--> 2.42 = FALSE
    test_promo(2.43);   //output--> 2.43 = TRUE
    test_promo(2.44);   //output--> 2.44 = FALSE
    test_promo(2.45);   //output--> 2.45 = TRUE
    test_promo(2.46);   //output--> 2.46 = FALSE
    test_promo(2.47);   //output--> 2.47 = TRUE
    test_promo(2.48);   //output--> 2.48 = FALSE
    test_promo(2.49);   //output--> 2.49 = TRUE
    echo "</pre>";

?>

如您所见,结果必须全部为 FALSE,但不是:S

它是 PHP 中的错误还是只有我的计算机(Ubuntu x64)有这个错误?

解决方案 :

作为下面的更正答案,我只需要像这样定义浮点数(之后的数字.$divprice = number_format( $newprice/intval($newprice), 2 );

4

3 回答 3

4

浮点数不能准确表示您以十进制形式发布的值。换句话说,2.43不是真的2.43,而是实际上 [something close to] 2.4300000000000003。所以当你除以243.00000000000003结果243会大于1

这不是 PHP 中的错误,只是浮点的工作方式(在任何语言中)。如果您需要使用精确的十进制值,您最好搜索特定的库来执行此操作。这个问题可能是一个很好的起点。

于 2013-02-24T05:03:58.187 回答
2

您需要将 $divprice 转换为整数,因为您的 $divprice 现在是浮动的并且因为这个事实:

PHP.NET

由于它们在内部表示的方式,测试浮点值是否相等是有问题的。但是,有一些方法可以绕过这些限制来比较浮点值。

解决方案:

$divprice = (int) ($tmpprice/intval($tmpprice));
于 2013-02-24T05:05:54.897 回答
1

这可能与如何处理浮点数有关(在任何语言中)。您可以将此称为舍入错误或其他任何内容,但作为一般规则,不建议比较浮点是否相等。所以在这种情况下使用if($divprice==1)也会产生意想不到的结果。

于 2013-02-24T05:01:02.017 回答