913

Ордена и медали

каждому мулю
0
jorjel125 Августа 2009, 00:15
J
jorjel125 Августа 2009, 00:15

не прикольно.

0
  • 0
  • 0
нудный__25 Августа 2009, 00:18
Н
нудный__25 Августа 2009, 00:18
...че за прикол в php...

гг :))

0
  • 0
  • 0
freejerk25 Августа 2009, 10:06
F
freejerk25 Августа 2009, 10:06

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.

0
  • 0
  • 0
indexmd25 Августа 2009, 13:41
I
indexmd25 Августа 2009, 13:41

я эту ошибку нашел в одной российской коммерческой cms
они фиг знает скольким клиентам уже ее продали
и с такой вот фигней

0
  • 0
  • 0
caliogstro25 Августа 2009, 14:17
C
caliogstro25 Августа 2009, 14:17
...1999 ..... 1998.9999999999998...

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.

0
  • 0
  • 0
iulikd25 Августа 2009, 14:43
I
iulikd25 Августа 2009, 14:43
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);

a = 1999
b = 1998
c = 1998
d = 1999

0
  • 0
  • 0
freejerk25 Августа 2009, 18:13
F
freejerk25 Августа 2009, 18:13
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
...я эту ошибку нашел в одной российской коммерческой...

Atunci ei nu au testat cum trebuie :D

0
  • 0
  • 0
нудный__31 Августа 2009, 09:43
Н
нудный__31 Августа 2009, 09:43
indexmd
...я эту ошибку нашел в одной российской коммерческой cms они фиг знает скольким клиентам уже ее продали и с такой вот фигней...

ггг
не ошибка это :) почитай, как хранятся действительные числа в памяти :) хз есть ли инфа от пшппрограммистов/учителей, ищи Си, паскаль. тама должно быть описано

но цену не стоит в флоат хранить, конечно

0
  • 0
  • 0
indexmd01 Сентября 2009, 13:21
I
indexmd01 Сентября 2009, 13:21
нудный__
...не ошибка это...

а что тогда?
если клиент, который у них купил эту cms, хочет поставить цену на товар в своем магазине 19.99
и в итоге получает цену в 19.98
это не ошибка?
почему он должен сам лезть в код и исправлять

$price=(int)($price*100);
на
$price*=100;
$price=(int)"$price";

и это не ошибка разработчиков?

0
  • 0
  • 0
нудный__01 Сентября 2009, 13:27
Н
нудный__01 Сентября 2009, 13:27
indexmd
...и это не ошибка разработчиков?...

вообще, да. не стоит использовать для цен флоат, я уже говорил. думаю, разработчики об этом даже не задумывались :)

0
  • 0
  • 0