De ce programarea?    Sa progresez continuu...

Minus zero. PHP

Pe scurt lucram eu la www.creditex.md, făceam un raport pentru mine să verific corectitudinea calculelor din sistem. Iaca așa o chestie: https://static.md/409b85d188bb1bb201efb460946d44d8.png

Și cînd mă uit mai bine văd https://static.md/82d8bdbc0d855fc0c3417e3cfb30b4e3.png

WTF?! Eu de exemplu nu știam că poate să fie -0.00 și +0.00

Ne uităm în cod acolo e ceva de genul: echo number_format($primaSuma - $douaSuma, 2)

Un mic intro, number_format formateaza un float astfel ca el să conțină un număr fix de zecimale, să fie separate zecimalele de partea întregă cu un anumit simbol și la mii să fie tot un anumit simbol. Des se folosește cînd merge vorba de afișat ceva bani, mai rar la aproximări încît el returnează string și în cadrul calculelor nu e bine de jucat cu operatorii aritmetici asupra string-urilor, dacă folosiți funcția dată în cadrul calculelor acest post pe pentru dvs.

Acum e clar de ce echo a afișat -0.00, deoare e string, să fi fost echo -0.00 se afișa un simplu 0.

Ok, dacă deja cred că ați înțeles că e o problemă a funcției number_format încît problemă în diferența a 2 variabile nu poate să fie, ar fi returnat un float. Și deci, în cazul dat diferența returnează un număr mai mic de -0.004(9), astfel number_format face round() cu precizia care o indici și deja formatează. După ce am rulat echo round(-0.004,2) am înțeles că echo defapt poate afișa float -0, iarăși o nedumerire încît dacă dorești simplu să afișezi -0 el o să îți afișeze 0. Deci problema e în round. Întrebare e de ce round returnează semn la zero și de ce echo anume la ceea ce returnează round afișează cu semn.

Și dacă te frămîntă tare întrebarea dată găsești pe net si raportarea ”bug-ului”: https://bugs.php.net/bug.php?id=53865 și defapt e tot normal :D, adică așa și trebuie să fie, cum se zice ”It's not a bug, it's a feature”.

Deci este un standard IEEE 754 ce se referă anume la floating-point arithmetic și acolo găsim iaca așa o informație https://en.wikipedia.org/wiki/Signed_zero unde e descris cum tăt lucrează.

Și totuși captivant subiect, de aici pot face o concluzie: sunt o mulțime de oameni care ștopăiesc site-ul pe Wordpress, fac forumuri, fac portale de noutăți alte feluri de site-ul și nu știu măcar cum lucrează php-ul acesta, cum dracu vine 0 cu minus și de ce el vine.

P.S. cu round se rezolvă simplu, dacă vă așteptați că poate să returneze -0 pur și simplu adăugați 0 la funcția dată și semnul va dispărea, dar iaca în cazul la number_format se încep vilasipede.

UPDATE: întilnit și în production


Ți-a plăcut articolul? Apasă Like:

Tag-uri:

Comentarii: