че за прикол в php?
может и боян, но раньше как-то не сталкивался$price = 19.99 * 100;echo intval($price) . "
\n"; выдает 1998echo intval("$price") . "
\n"; выдает 1999printf("%.13f", $price);выдает 1998.9999999999998
\n"; выдает 1998echo intval("$price") . "
\n"; выдает 1999printf("%.13f", $price);выдает 1998.9999999999998
не прикольно.
Pare stupid la prima vedere, dar!
Daca citesti documentatia gasesti si raspunsul.
Deci, dupa atribuirea valorii de 1999, $price este de tip double.
Citind documentatia despre numerele reale la http://us.php.net/manual/en/language.types.float.php gasesti o avertizare
It is typical that simple decimal fractions like 0.1 or 0.7 cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9
E destul de interesant de vazut cum alte limbaje rezolva (sau nu) aceasta problema.
Deci daca reprezentarea 1999 double in PHP este 1998.9999999999998 => atunci raspunsul la de ce echo intval($price) . "
\n"; afiseaza 1998 e destul de clar (eu cred). intval() intoarce doar partea intreaga a numarului.
echo intval("$price") . "
\n";
Afiseaza 1999, pentru ca se face casting in string, din cauza la ghilimele: "".
Iar ultimul rand precum am zis e din cauza la reprezentarea interna a numerelor reale.
я эту ошибку нашел в одной российской коммерческой cms
они фиг знает скольким клиентам уже ее продали
и с такой вот фигней