round($x) arredonda para o inteiro mais próximo, floor($x) sempre arredonda para baixo e ceil($x) sempre arredonda para cima. Passe um segundo argumento ao round() para as casas decimais: round(3.14159, 2) é 3.14.
As três retornam float, mesmo quando o valor é inteiro. var_dump(round(5)) imprime float(5), então faça um cast com (int) quando precisar de um inteiro.
Arredondar para 2 casas decimais
O segundo argumento do round() é a precisão. Um número positivo arredonda para essa quantidade de casas decimais. Um número negativo arredonda à esquerda do ponto decimal, o que é prático para números aproximados como "cerca de 1.200 visitantes".
round(3.10, 2) imprime 3.1 porque um float não sabe quantos zeros você queria. Quando o número vai para uma página (preços, porcentagens), formate-o: number_format() transforma 3.1 em "3.10" com number_format(3.1, 2), e sprintf('%.2f', $x) faz o mesmo.
Arredondar a metade para cima, para baixo ou para o par
Por padrão, o round() arredonda a metade para longe do zero, que é o arredondamento que a maioria aprendeu na escola. O terceiro argumento escolhe outra regra para valores exatamente no meio entre dois números.
PHP_ROUND_HALF_EVEN é o "arredondamento bancário": as metades vão para o número par mais próximo, então arredondar muitos valores não gera um desvio para cima com o tempo. Código de contabilidade costuma querer isso.
floor e ceil com números negativos
floor() vai em direção a menos infinito e ceil() em direção a mais infinito. Com números negativos isso surpreende: floor(-3.5) é -4, não -3. Se você quer cortar as casas decimais (truncar em direção ao zero), faça um cast para int.
A linha da paginação é o uso clássico do ceil(): qualquer item que sobrar ainda precisa de uma página.
Divisão inteira e módulo
/ retorna float quando a divisão não é exata, então 7 / 2 é 3.5. Para divisão inteira use intdiv(), que descarta o resto, e % para o próprio resto.
% converte os dois operandos em inteiros primeiro, então 7.5 % 2 é 1, e desde o PHP 8.1 também imprime Deprecated: Implicit conversion from float 7.5 to int loses precision. Use fmod() quando as casas decimais importarem. Dividir por zero com /, intdiv() ou % lança um DivisionByZeroError no PHP 8, então verifique o divisor antes quando ele vier da entrada.
Potências, raízes, abs, max e min
** eleva a uma potência (pow() faz o mesmo), sqrt() calcula a raiz quadrada e abs() remove o sinal. max() e min() recebem vários argumentos ou um array.
** é avaliado da direita para a esquerda, então 2 ** 3 ** 2 significa 2 ** 9. O par max(0, min(100, $x)) é o jeito comum de limitar um valor entre um mínimo e um máximo. M_PI guarda o valor de pi se você precisar para círculos.
Números aleatórios com random_int e rand
random_int($min, $max) retorna um inteiro aleatório com as duas pontas incluídas. A saída muda a cada execução, então clique em Run algumas vezes.
Use random_int() para tudo que envolve segurança: códigos de login, tokens, links de redefinição de senha. rand() e mt_rand() continuam funcionando e aceitam os mesmos argumentos ($min, $max), mas a sequência delas pode ser prevista. Para embaralhar e sortear com uma fonte segura, o PHP 8.2 adicionou Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Por que floor() às vezes dá a resposta errada
Floats são guardados em binário, e muitos valores decimais (como 0.1) não podem ser guardados com exatidão. Na maior parte do tempo a impressão esconde isso, mas floor() e (int) não arredondam, eles cortam, e um valor como 7.999999999 vira 7.
Quando você precisa de decimais exatos, como com dinheiro, guarde unidades inteiras (centavos como inteiros: 1999 em vez de 19.99) e divida só na hora de exibir. Arredondar para uma precisão razoável antes do floor() ou do ceil(), como na última linha, também resolve a maioria dos casos.
Perguntas frequentes
Como arredondo para 2 casas decimais no PHP?
Passe o número de casas como segundo argumento: round(3.14159, 2) retorna 3.14. Ele retorna um float, então para exibir com um número fixo de casas (3.10 em vez de 3.1) use number_format($x, 2) ou sprintf('%.2f', $x).
Como arredondo para baixo no PHP?
floor($x) arredonda para o inteiro imediatamente abaixo: floor(4.9) é 4 e floor(-4.1) é -5. Para descartar as casas decimais em direção ao zero, faça um cast com (int) $x, que transforma -4.9 em -4.
Por que round() retorna um float no PHP?
round(), floor() e ceil() sempre retornam float, mesmo quando o resultado é inteiro: var_dump(round(5)) imprime float(5). Envolva a chamada em (int) ou intval() quando precisar de um inteiro, por exemplo como índice de array.
Qual a diferença entre rand() e random_int() no PHP?
random_int(1, 6) usa uma fonte criptograficamente segura e é a que deve ser usada para tokens, códigos e qualquer coisa que um usuário possa tentar adivinhar. rand() e mt_rand() são mais rápidas, mas previsíveis. As três incluem as duas pontas do intervalo.
Como obtenho o resto de uma divisão no PHP?
Use o operador % para inteiros: 17 % 5 é 2. O resultado tem o sinal do operando da esquerda, então -7 % 3 é -1. Para floats use fmod(7.5, 2), que retorna 1.5.