1

値 float と integer を除算した後の 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) だけにこのバグがありますか?

解決 :

以下の正解のように、.このように define (の後の数字)として浮動小数点数のみを取得する必要があります。$divprice = number_format( $newprice/intval($newprice), 2 );

4

3 に答える 3

4

浮動小数点は、10 進数で転記した値を正確に表すことはできません。つまり、2.43は実際には2.43ではなく、実際には [に近いもの]2.4300000000000003です。したがって、結果で割る243.00000000000003243よりも大きくなり1ます。

これは PHP のバグではなく、(どの言語でも)浮動小数点が機能する方法です。正確な 10 進数値を処理する必要がある場合は、そのために特定のライブラリを検索することをお勧めします。この質問は良い出発点かもしれません。

于 2013-02-24T05:03:58.187 に答える
2

$divprice が float になっているため、$divprice を整数にキャストする必要があります。

PHP.NET

浮動小数点値が等しいかどうかをテストすることは、それらが内部的に表現される方法のために問題があります。ただし、これらの制限を回避して浮動小数点値を比較する方法があります。

解決:

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

これはおそらく、浮動小数点数の処理方法に関連しています (任意の言語で)。この丸め誤差などを呼び出すことができますが、一般的な規則として、浮動小数点を比較して等しいかどうかを確認することはお勧めしません。したがって、この場合、 を使用if($divprice==1)すると予期しない結果が生じることもあります。

于 2013-02-24T05:01:02.017 に答える