2017-02-07 1 views
0

PHP에서 2 개의 값을 비교하려고합니다.PHP - 2 float 값을 비교할 때 이상한 결과가 있습니다.

내 논리는 : 나는 잔량 (a)는

  • 나는 금액을 충전 할 필요가있다

    1. (B) 나는 (A - B)에 의해로 남아 계산해
    2. 충전 작업 후
    3. 나는 (C) 내가 (C)
    ,369로 # 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에 캐스팅해야합니다. 나는 당신이 말한 요점에 대해서 몰랐습니다. 캐스트를 입력 할 때'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)

    관련 문제