PHP i magiczne -0

Łukasz Piotrowski Komentarzy 0

    Dziś podczas codziennego firmowego programowania przyszło mi zmieniać kod który ktoś już kiedyś napisał. Było tam sporo ciekawych kwiatków np:

        if(!isset($mod_price)) $mod_price = '-0.00';
    

    Później w kodzie ktoś napisał że pojawia mu się czasami "-0.00" i trzeba zazstosować fix w postaci:

    $price_mod = ((float)$price_mod + 1 ) - 1;
    

    Myślę sobie ok. Skoro tak jest no trudno.

    Jednak cała sytuacja wynikała z zastosowanej techniki dodawania modyfikatora ceny do ceny produktu.


    Mały przykładzik:

    Produkt A kosztuje 1000zł, Jako jedna z opcji jest dodatkowa warstwa papieru. Modyfikator ceny to +100 zł.
    Jednak inna opcja z mniejszą ilością papieru ma modyfikator ceny -100zł.

    Żeby było śmiesznie to całość jest zapisana +/- tak:

    $price = 1000.00;
    $price_mod = '+';
    $price_mod_value = 100;
    

    Rozwiązałem to np tak:

    $price += (float)($price_mod.$price_mod_value);

    Sprawdza się świetnie dla + i -.
    Ale ciekawy efekt otrzymamy jeżeli ewaluujemy takie wyrażenie:

    $price_mod = '-';
    $price_mod_value = 0;
    var_dump((float)($price_mod.$price_mod_value));
    
    // Otrzymamy wynik:
    // float -0.00
    

    Fajne prawda?
    Okazuje się że problem już dawno został zgłoszony np. tu: https://bugs.php.net/bug.php?id=53865
    Stwierdzono że nie ma problemu, to nie Bug :) Jak dla mnie nie widzę zasadności posiadaniafloat -0.

    A co Wy na to?

    — Edited
    Poprawiłem ostatni przykład bo faktycznie wkradł się nie ten co zamierzał :)

    Top