Таварисчи марспецы и марспецки.Наступил долгожданный отпуск и я уезжаю на моря. Посему неделю будете тут без присмотра. В общем, надеюсь посуду бить не будете и хату нашу не спалите.Самому активному принесу кулек с песком в качестве приза.
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.
eu cand ma uit mai atent, eu nu vad mare diferenta intre aceste numere, si practic nu vad eroare. Cand convertesti numarul in numar fix, totul este simplu. Iar cand lucrezi cu numere fractionare, nu intotdeauna e chiar asa de simplu.
...19.99 * 100;...
se creaza un numar in virgula mobila 19.99. Gandeste-te cum poate fi reprezentat acest numar la nivel binar? Apoi acest numar cumva trebuie convertit in ceva human readable. Cand vei calcula singur numarul binar, vei vedea ca el nu poate fi reprezentat exact asa de simplu cum ai introdus 19.99. Faptul ca ai inmultit un numar binar cu 100 nu inseamna ca ai scapat de partea decimala. Eu pot presupune ca dupa X*100 unica ce s-a schimbat in numar X este numai exponenta.
freejerk...E destul de interesant de vazut cum alte limbaje rezolva (sau nu) aceasta problema....
C#: int a = (int) Math.Ceiling(1998.9999999999998); int b = (int) Math.Floor(1998.9999999999998); int c = (int) 1998.9999999999998; int d = Convert.ToInt32(1998.9999999999998);
iulikd...freejerk: "... E destul de interesant de vazut cum...
iese ca fix asa functioneaza.
Can am zis de alte limbaje defapt mi-am adus aminte de Python care tot in release notes la 3.0 cel putin scriau ca tot sunt careva probleme cu numerele reale. Dar cred ca Caliogstro are dreptate in modul cat de "ne-usor" este sa reprezinti aceste numere.
indexmd...я эту ошибку нашел в одной российской коммерческой...
indexmd...я эту ошибку нашел в одной российской коммерческой cms они фиг знает скольким клиентам уже ее продали и с такой вот фигней...
ггг не ошибка это :) почитай, как хранятся действительные числа в памяти :) хз есть ли инфа от пшппрограммистов/учителей, ищи Си, паскаль. тама должно быть описано
а что тогда? если клиент, который у них купил эту cms, хочет поставить цену на товар в своем магазине 19.99 и в итоге получает цену в 19.98 это не ошибка? почему он должен сам лезть в код и исправлять
$price=(int)($price*100); на $price*=100; $price=(int)"$price";
не прикольно.
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
они фиг знает скольким клиентам уже ее продали
и с такой вот фигней