round($x) redondea al entero más cercano, floor($x) siempre redondea hacia abajo y ceil($x) siempre hacia arriba. Dale a round() un segundo argumento para los decimales: round(3.14159, 2) es 3.14.
Las tres devuelven un float, aunque el valor sea entero. var_dump(round(5)) imprime float(5), así que haz un cast con (int) cuando necesites un entero.
Redondear a 2 decimales
El segundo argumento de round() es la precisión. Un número positivo redondea a esa cantidad de decimales. Un número negativo redondea a la izquierda del punto decimal, algo útil para cifras aproximadas como "unos 1.200 visitantes".
round(3.10, 2) imprime 3.1 porque un float no sabe cuántos ceros querías. Cuando el número va a mostrarse en una página (precios, porcentajes), dale formato: number_format() convierte 3.1 en "3.10" con number_format(3.1, 2), y sprintf('%.2f', $x) hace lo mismo.
Redondear la mitad hacia arriba, hacia abajo o al par
Por defecto, round() redondea la mitad alejándose de cero, que es el redondeo que casi todos aprendimos en el colegio. El tercer argumento elige otra regla para los valores que están justo a medio camino entre dos números.
PHP_ROUND_HALF_EVEN es el "redondeo bancario": las mitades van al número par más cercano, así que redondear muchos valores no acumula un sesgo hacia arriba con el tiempo. El código de contabilidad suele necesitarlo.
floor y ceil con números negativos
floor() se mueve hacia menos infinito y ceil() hacia más infinito. Con números negativos eso sorprende: floor(-3.5) es -4, no -3. Si lo que quieres es quitar los decimales (truncar hacia cero), haz un cast a int.
La línea de la paginación es el uso clásico de ceil(): cualquier elemento sobrante sigue necesitando una página.
División entera y módulo
/ devuelve un float cuando la división no es exacta, así que 7 / 2 es 3.5. Para la división entera usa intdiv(), que descarta el resto, y % para obtener el propio resto.
% convierte primero los dos operandos a enteros, así que 7.5 % 2 es 1, y desde PHP 8.1 además imprime Deprecated: Implicit conversion from float 7.5 to int loses precision. Usa fmod() cuando importen los decimales. Dividir por cero con /, intdiv() o % lanza un DivisionByZeroError en PHP 8, así que comprueba el divisor cuando venga de la entrada del usuario.
Potencias, raíces, abs, max y min
** eleva a una potencia (pow() hace lo mismo), sqrt() calcula una raíz cuadrada y abs() quita el signo. max() y min() aceptan varios argumentos o un único array.
** se evalúa de derecha a izquierda, así que 2 ** 3 ** 2 significa 2 ** 9. La pareja max(0, min(100, $x)) es la forma habitual de limitar un valor entre un mínimo y un máximo. M_PI contiene pi por si lo necesitas para círculos.
Números aleatorios con random_int y rand
random_int($min, $max) devuelve un entero aleatorio con los dos extremos incluidos. La salida cambia en cada ejecución, así que pulsa Ejecutar varias veces.
Usa random_int() para todo lo relacionado con la seguridad: códigos de inicio de sesión, tokens, enlaces para restablecer la contraseña. rand() y mt_rand() siguen funcionando y aceptan los mismos argumentos ($min, $max), pero su secuencia se puede predecir. Para barajar y elegir con una fuente segura, PHP 8.2 añadió Random\Randomizer ($r->getInt(1, 6), $r->shuffleArray($a)).
Por qué floor() a veces da una respuesta incorrecta
Los floats se guardan en binario, y muchos valores decimales (como 0.1) no se pueden guardar exactamente. Casi siempre la impresión lo disimula, pero floor() y (int) no redondean, cortan, y un valor como 7.999999999 se convierte en 7.
Cuando necesites decimales exactos, como con el dinero, guarda unidades enteras (céntimos como integers: 1999 en lugar de 19.99) y divide solo para mostrar. Redondear a una precisión razonable antes de floor() o ceil(), como en la última línea, también arregla la mayoría de los casos.
Preguntas frecuentes
¿Cómo redondeo a 2 decimales en PHP?
Pasa el número de decimales como segundo argumento: round(3.14159, 2) devuelve 3.14. Devuelve un float, así que para mostrar un número fijo de decimales (3.10 en lugar de 3.1) usa number_format($x, 2) o sprintf('%.2f', $x).
¿Cómo redondeo hacia abajo en PHP?
floor($x) redondea hacia abajo al entero inferior: floor(4.9) es 4 y floor(-4.1) es -5. Para quitar los decimales hacia cero, haz un cast con (int) $x, que convierte -4.9 en -4.
¿Por qué round() devuelve un float en PHP?
round(), floor() y ceil() siempre devuelven un float, aunque el resultado sea entero: var_dump(round(5)) imprime float(5). Envuelve la llamada en (int) o intval() cuando necesites un entero, por ejemplo como índice de un array.
¿Cuál es la diferencia entre rand() y random_int() en PHP?
random_int(1, 6) usa una fuente criptográficamente segura y es la que debes usar para tokens, códigos y cualquier cosa que un usuario pueda intentar adivinar. rand() y mt_rand() son más rápidas pero predecibles. Las tres incluyen los dos extremos del rango.
¿Cómo obtengo el resto de una división en PHP?
Usa el operador % con enteros: 17 % 5 es 2. El resultado toma el signo del operando izquierdo, así que -7 % 3 es -1. Para floats usa fmod(7.5, 2), que devuelve 1.5.