round($x) zaokrągla do najbliższej liczby całkowitej, floor($x) zawsze zaokrągla w dół, a ceil($x) zawsze w górę. Podaj round() drugi argument, aby określić miejsca po przecinku: round(3.14159, 2) daje 3.14.
Wszystkie trzy zwracają float, nawet gdy wartość jest całkowita. var_dump(round(5)) wypisuje float(5), więc rzutuj przez (int), gdy potrzebujesz liczby całkowitej.
Zaokrąglanie do 2 miejsc po przecinku
Drugi argument round() to precyzja. Liczba dodatnia zaokrągla do tylu miejsc po przecinku. Liczba ujemna zaokrągla na lewo od przecinka, co przydaje się do przybliżonych liczb typu „około 1200 odwiedzających”.
round(3.10, 2) wypisuje 3.1, bo float nie wie, ile zer chciałeś. Gdy liczba trafia na stronę (ceny, procenty), sformatuj ją: number_format() zamienia 3.1 w "3.10" przez number_format(3.1, 2), a sprintf('%.2f', $x) robi to samo.
Połówki w górę, w dół albo do parzystej
Domyślnie round() zaokrągla połówkę od zera, czyli tak, jak większość z nas uczyła się w szkole. Trzeci argument wybiera inną regułę dla wartości dokładnie w połowie między dwiema liczbami.
PHP_ROUND_HALF_EVEN to „zaokrąglanie bankierskie”: połówki idą do najbliższej liczby parzystej, więc zaokrąglanie wielu wartości z czasem nie dryfuje w górę. Kod księgowy często tego potrzebuje.
floor i ceil z liczbami ujemnymi
floor() idzie w stronę minus nieskończoności, a ceil() w stronę plus nieskończoności. Przy liczbach ujemnych to zaskakuje: floor(-3.5) daje -4, a nie -3. Jeśli chcesz odciąć część ułamkową (obcięcie w stronę zera), rzutuj na int.
Linia z paginacją to klasyczne użycie ceil(): każdy pozostały element nadal potrzebuje strony.
Dzielenie całkowite i modulo
/ zwraca float, gdy dzielenie nie jest bez reszty, więc 7 / 2 daje 3.5. Do dzielenia całkowitego użyj intdiv(), które odrzuca resztę, a do samej reszty %.
% najpierw konwertuje oba operandy na liczby całkowite, więc 7.5 % 2 daje 1, a od PHP 8.1 wypisuje też Deprecated: Implicit conversion from float 7.5 to int loses precision. Użyj fmod(), gdy część ułamkowa ma znaczenie. Dzielenie przez zero przez /, intdiv() albo % rzuca w PHP 8 DivisionByZeroError, więc sprawdź dzielnik, gdy pochodzi z danych wejściowych.
Potęgi, pierwiastki, abs, max i min
** podnosi do potęgi (pow() robi to samo), sqrt() liczy pierwiastek kwadratowy, a abs() usuwa znak. max() i min() przyjmują kilka argumentów albo jedną tablicę.
** jest obliczane od prawej do lewej, więc 2 ** 3 ** 2 oznacza 2 ** 9. Para max(0, min(100, $x)) to typowy sposób ograniczenia wartości między dolną a górną granicą. M_PI przechowuje liczbę pi, jeśli potrzebujesz jej do okręgów.
Liczby losowe przez random_int i rand
random_int($min, $max) zwraca losową liczbę całkowitą z oboma końcami włącznie. Wynik zmienia się przy każdym uruchomieniu, więc kliknij Run kilka razy.
Używaj random_int() do wszystkiego, co dotyczy bezpieczeństwa: kodów logowania, tokenów, linków do resetu hasła. rand() i mt_rand() nadal działają i przyjmują te same argumenty ($min, $max), ale ich sekwencję da się przewidzieć. Do tasowania i losowania z bezpiecznego źródła PHP 8.2 dodał Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Dlaczego floor() czasem daje złą odpowiedź
Floaty są przechowywane binarnie, a wielu wartości dziesiętnych (jak 0.1) nie da się zapisać dokładnie. Zwykle wypisanie to ukrywa, ale floor() i (int) nie zaokrąglają, tylko obcinają, więc wartość w rodzaju 7.999999999 staje się 7.
Gdy potrzebujesz dokładnych wartości dziesiętnych, jak przy pieniądzach, przechowuj całe jednostki (grosze jako liczby całkowite: 1999 zamiast 19.99) i dziel tylko do wyświetlenia. Zaokrąglenie do sensownej precyzji przed floor() albo ceil(), jak w ostatniej linii, też naprawia większość przypadków.
Najczęściej zadawane pytania
Jak zaokrąglić do 2 miejsc po przecinku w PHP?
Przekaż liczbę miejsc jako drugi argument: round(3.14159, 2) zwraca 3.14. Wynik jest floatem, więc do wyświetlania ze stałą liczbą miejsc (3.10, a nie 3.1) użyj number_format($x, 2) albo sprintf('%.2f', $x).
Jak zaokrąglić w dół w PHP?
floor($x) zaokrągla w dół do najbliższej mniejszej liczby całkowitej: floor(4.9) daje 4, a floor(-4.1) daje -5. Aby zamiast tego odciąć część ułamkową w stronę zera, rzutuj przez (int) $x, co zamienia -4.9 w -4.
Dlaczego round() zwraca float w PHP?
round(), floor() i ceil() zawsze zwracają float, nawet gdy wynik jest całkowity: var_dump(round(5)) wypisuje float(5). Opakuj wywołanie w (int) albo intval(), gdy potrzebujesz liczby całkowitej, na przykład jako indeksu tablicy.
Czym różni się rand() od random_int() w PHP?
random_int(1, 6) korzysta z kryptograficznie bezpiecznego źródła i to jej należy używać do tokenów, kodów i wszystkiego, co użytkownik mógłby próbować odgadnąć. rand() i mt_rand() są szybsze, ale przewidywalne. Wszystkie trzy obejmują oba końce zakresu.
Jak uzyskać resztę z dzielenia w PHP?
Dla liczb całkowitych użyj operatora %: 17 % 5 daje 2. Wynik ma znak lewego operandu, więc -7 % 3 daje -1. Dla floatów użyj fmod(7.5, 2), które zwraca 1.5.