round($x)는 가장 가까운 정수로 반올림하고, floor($x)는 항상 내림, ceil($x)는 항상 올림합니다. round()에 두 번째 인자를 주면 소수 자릿수가 됩니다: round(3.14159, 2)는 3.14입니다.
셋 다 값이 정수라도 float를 반환합니다. var_dump(round(5))는 float(5)를 출력하므로, 정수가 필요하면 (int)로 캐스트하세요.
소수점 둘째 자리로 반올림
round()의 두 번째 인자는 정밀도입니다. 양수는 그 자릿수의 소수로 반올림합니다. 음수는 소수점 왼쪽에서 반올림하며, "방문자 약 1,200명" 같은 대략적인 수치에 편리합니다.
round(3.10, 2)는 3.1을 출력합니다. float는 0을 몇 개 원했는지 알지 못하기 때문입니다. 숫자를 페이지에 표시한다면(가격, 퍼센트) 서식을 지정하세요: number_format()은 number_format(3.1, 2)로 3.1을 "3.10"으로 바꾸고, sprintf('%.2f', $x)도 같습니다.
0.5 처리: 올리기, 내리기, 짝수로
기본적으로 round()는 0.5를 0에서 먼 쪽으로 보내며, 학교에서 배운 반올림과 같습니다. 세 번째 인자는 두 수의 정확히 가운데에 있는 값에 다른 규칙을 적용합니다.
PHP_ROUND_HALF_EVEN은 "은행가 반올림"입니다. 0.5는 가장 가까운 짝수로 가므로, 많은 값을 반올림해도 시간이 지나며 위로 치우치지 않습니다. 회계 코드에서 자주 필요합니다.
음수에서의 floor와 ceil
floor()는 음의 무한대 쪽으로, ceil()은 양의 무한대 쪽으로 움직입니다. 음수에서는 이것이 의외입니다: floor(-3.5)는 -3이 아니라 -4입니다. 0 방향으로 소수를 버리려면 int로 캐스트하세요.
페이지 나누기 줄은 ceil()의 대표적인 용도입니다. 남은 항목이 하나라도 있으면 페이지가 하나 더 필요합니다.
정수 나눗셈과 나머지
/는 나누어떨어지지 않으면 float를 반환하므로 7 / 2는 3.5입니다. 정수 나눗셈에는 나머지를 버리는 intdiv()를, 나머지 자체에는 %를 쓰세요.
%는 먼저 두 피연산자를 정수로 변환하므로 7.5 % 2는 1이며, PHP 8.1부터는 Deprecated: Implicit conversion from float 7.5 to int loses precision도 출력합니다. 소수가 중요하면 fmod()를 쓰세요. PHP 8에서 /, intdiv(), %로 0으로 나누면 DivisionByZeroError가 던져지므로, 제수가 입력에서 온다면 먼저 확인하세요.
거듭제곱, 제곱근, abs, max, min
**는 거듭제곱(pow()도 같음), sqrt()는 제곱근, abs()는 부호 제거입니다. max()와 min()은 여러 인자나 배열 하나를 받습니다.
**는 오른쪽에서 왼쪽으로 평가되므로 2 ** 3 ** 2는 2 ** 9를 뜻합니다. max(0, min(100, $x)) 쌍은 값을 하한과 상한 사이로 제한하는 일반적인 방법입니다. 원에 필요하다면 M_PI에 원주율이 들어 있습니다.
random_int와 rand로 난수 만들기
random_int($min, $max)는 양 끝을 포함한 임의의 정수를 반환합니다. 실행할 때마다 출력이 바뀌므로 Run을 몇 번 눌러 보세요.
로그인 코드, 토큰, 비밀번호 재설정 링크처럼 보안과 관련된 것에는 random_int()를 쓰세요. rand()와 mt_rand()도 여전히 동작하며 같은 ($min, $max) 인자를 받지만, 그 수열은 예측할 수 있습니다. 안전한 소스로 섞고 고르려면 PHP 8.2에서 추가된 Random\Randomizer($r->getInt(1, 6), $r->shuffleArray($a))를 쓰세요.
floor()가 가끔 틀린 답을 내는 이유
float는 2진수로 저장되며, 많은 소수 값(0.1 등)은 정확히 저장할 수 없습니다. 대부분은 출력할 때 가려지지만, floor()와 (int)는 반올림하지 않고 잘라 내므로 7.999999999 같은 값이 7이 됩니다.
금액처럼 정확한 소수가 필요하면 정수 단위로 저장하고(센트를 정수로: 19.99 대신 1999) 표시할 때만 나누세요. 마지막 줄처럼 floor()나 ceil() 전에 적당한 정밀도로 반올림하는 것도 대부분의 경우를 해결합니다.
자주 묻는 질문
PHP에서 소수점 둘째 자리로 반올림하려면 어떻게 하나요?
두 번째 인자로 소수 자릿수를 넘기세요: round(3.14159, 2)는 3.14를 반환합니다. float를 반환하므로, 소수 자릿수를 고정해서 표시하려면(3.1이 아니라 3.10) number_format($x, 2)나 sprintf('%.2f', $x)를 쓰세요.
PHP에서 내림은 어떻게 하나요?
floor($x)는 바로 아래 정수로 내립니다: floor(4.9)는 4, floor(-4.1)은 -5입니다. 0 방향으로 소수를 버리려면 (int) $x로 캐스트하세요. -4.9가 -4가 됩니다.
PHP의 round()가 float를 반환하는 이유는?
round(), floor(), ceil()은 결과가 정수라도 항상 float를 반환합니다: var_dump(round(5))는 float(5)를 출력합니다. 배열 인덱스처럼 정수가 필요하면 호출을 (int)나 intval()로 감싸세요.
PHP에서 rand()와 random_int()의 차이는 무엇인가요?
random_int(1, 6)은 암호학적으로 안전한 소스를 쓰며, 토큰, 코드처럼 사용자가 추측하려 할 수 있는 모든 것에 써야 합니다. rand()와 mt_rand()는 더 빠르지만 예측 가능합니다. 셋 다 범위의 양 끝을 포함합니다.
PHP에서 나눗셈의 나머지는 어떻게 구하나요?
정수에는 % 연산자를 쓰세요: 17 % 5는 2입니다. 결과는 왼쪽 피연산자의 부호를 따르므로 -7 % 3은 -1입니다. float에는 1.5를 반환하는 fmod(7.5, 2)를 쓰세요.