2017-02-07 8 views
0

PHPで2つの値を比較しようとしています。PHP - 2つの浮動小数点値を比較すると奇妙な結果

私のロジックがある:私は残りの量(a)が

  • Iの量が充電されなければならた

    1. (b)のIは、( - b)であることが残っている計算
    2. 充電動作の後
    3. は、私は(C)私は(C)
    で第3位で私が得た値を比較
  • 実際の残りの値を取得します

    両方が似ているにもかかわらず、PHPは等しいとは言いません。与えられた以下

    は(いっぱいの値を持つ)自分のコード

    <?php 
    $remaining_amount_before_payment = "600"; 
    $remaining_amount_after_payment = (float)$remaining_amount_before_payment - (float)"387.60"; 
    $actual_remaining_amount_after_payment = "212.4"; 
    echo "actual_remaining_amount_after_payment: {$actual_remaining_amount_after_payment} <br><br>"; 
    echo "remaining_amount_after_payment: {$remaining_amount_after_payment} <br><br>"; 
    var_dump(((float)$actual_remaining_amount_after_payment) == ((float)$remaining_amount_after_payment));?> 
    

    私はfloatに値をキャストするタイプですが、var_dump戻りFALSE

    これはなぜですか?

    私はPHP 5.6を使用しています。

    ありがとうございます!

  • +1

    )なぜ最初の場所に文字列として数字を書いていますか?絶対に**これを行う理由はありません**。 b)浮動小数点計算は正確ではないことを知っていますか?あなたは知っている[浮動小数点ガイド](http://floating-point-gui.de/)を読んでいる? c)そしてあなた自身が言ったように: "両者は類似しているが、PHPは同等ではないと言っている。 - あなたは "類似"と "等しい"が同じではないことを知っていますか? ;) –

    +0

    実際の値はAPIから得られたもので、文字列として扱われます。だから私はAPIの応答を制御できないので、それらを 'float'にキャストするのです! あなたが言ったポイント(b)について私は知らなかった。キャストに 'float'を使うのは良いことではありませんか? – masterFly

    答えて

    0

    使用のvar_dump(ABS(FLOATVAL($のactual_remaining_amount_after_payment)== FLOATVAL($のremaining_amount_after_payment)) == 0);

    0

    ビンゴ!

    私はキャッチをキャッチしたいくつかの試みの後に。私は狂っていた。

    "問題は" 右の内側に丸めた値

    $remaining_amount_before_payment = floatval("600"); // use floatval istead of (float) 
    $remaining_amount_after_payment = round($remaining_amount_before_payment - floatval("387.60"), 2);// use floatval istead of (float) and round result 
    $actual_remaining_amount_after_payment = floatval("212.4");// use floatval 
    echo "actual_remaining_amount_after_payment: {$actual_remaining_amount_after_payment} <br><br>"; 
    echo "remaining_amount_after_payment: {$remaining_amount_after_payment} <br><br>"; 
    
    var_dump($actual_remaining_amount_after_payment === $remaining_amount_after_payment); // return TRUE 
    

    Example

    ほらです!あなたの変数 '$のremaining_amount_after_payment' acual

    0

    は本当に212.4

    がその値を決定するためでvar_exportを使用していません。 私の関心事では、浮動小数点値を精度に丸める必要があります。 round(x, precision)比較のため

    関連する問題