Menu

PHP round(), floor() e ceil(): arredondar e matemática

round($x, 2) arredonda para duas casas decimais, floor() sempre arredonda para baixo e ceil() sempre arredonda para cima. Mais intdiv(), o operador %, ** para potências, abs(), max(), min() e random_int() para números aleatórios.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR