21. 02. 2011. | #1 |
Ivan Dilber
Sir Write-a-Lot
|
PHP i unsigned int (ili big int)
Kako raditi sa velikim brojevima, tipa facebook id-jevi?
Morao sam da ih prebacim da budu varchar, da bih mogao da ih poredim... php ih izgleda tretira kao float i onda == ne radi kako treba...
__________________
Leadership is the art of getting people to want to do what you know must be done. |
21. 02. 2011. | #2 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
PHP sve brojeve vece od limita za INT tip implicitno prebacuje u Float. Imas to lepo opisano u manualu:
http://www.php.net/manual/en/language.types.integer.php Tako da npr: PHP kôd:
nonfixed type string pa mi nije bas najjasnije sta je pisac hteo da kaze Inace mozes da probas neke od tih "math" extenzija, ceo spisak imas ovde. |
21. 02. 2011. | #3 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Btw max vrednost int tipa je definisana konstantom PHP_INT_MAX . Naravno mozes koristiti i vece brojeve, jedino sto ih on tretira kao float.
|
21. 02. 2011. | #4 | |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Citat:
Šta onda bude: Kôd:
<?php $large_number1 = 1234567892147483647; var_dump($large_number1); // float(1.23456789215E+18) $large_number2 = 1234567892147483648; var_dump($large_number2); // float(1.23456789215E+18) $result = $large_number1 == $large_number2; var_dump($result); // bool(true) ?>
__________________
blog |
|
21. 02. 2011. | #5 |
Ivan Dilber
Sir Write-a-Lot
|
provalio sam kasnije, problem je zapravo bio u tome sto sam na jednom mestu imao casting u (int), koji je onda naprosto odsecao vrednost na PHP_INT_MAX (bez da baci warning, sto je malo trulo)
A inace, da li je float safe za poredjenje u ovom slucaju implicitnog kastinga za velike brojeve? Obicno se ne preporucuje porediti float vrednosti, mada deluje da u ovom slucaju rade kako treba... @jablan: samo zbog velicine i brzine indexa po tom polju, mada za ovaj slucaj je u principu nebitno... ali moc navike
__________________
Leadership is the art of getting people to want to do what you know must be done. Poslednja izmena od ivanhoe : 21. 02. 2011. u 12:15. |
21. 02. 2011. | #6 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
@jablan
Bolji primer je ovo: PHP kôd:
|
21. 02. 2011. | #7 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Pa dobro, desi se ponekad da veliki brojevi trebaju i onima koji ne prave rakete.
Bez neumesnih poređenja (samo komentarišemo): ako su već odlučili da rade implicitnu konverziju kad se pređe limit (što je sasvim OK za jedan high-level jezik), bilo je logično da se konvertuje u arbitrary precision integer (linkovao si već par biblioteka koje se time bave), a ne u float.
__________________
blog |
21. 02. 2011. | #8 |
Igor Marinović
Expert
|
Float brojevi se baš i ne upoređuju na jednakost bez velike potrebe, baš zbog prikazanih problema. Ne važi to samo za PHP, nego za bilo koji programski jezik.
Naročito ako ima dosta računanja, pa se greška nagomila ...
__________________
marinowski.com |
|
|