Dos decimales en PHP: métodos top 2025 para formatear números

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué «simplemente round()» ya no funciona? Una mirada al 2025

\n\n

Cualquiera que haya escrito alguna vez una tienda online, un módulo contable o un parser de tipos de cambio en PHP se ha enfrentado a la pregunta: «¿Cómo mostrar elegantemente el número 19.9999999999999 como 20.00?» En Stack Overflow, esta pregunta acumula miles de visitas, y no es casualidad. En 2025, cuando PHP ostenta con orgullo la versión 8.4 y superiores, los viejos trucos con round() a veces nos deparan sorpresas dignas de una película de terror.

\n\n

Aclaremos esto de una vez por todas: cómo mostrar un número con dos decimales en PHP, de forma fiable, elegante y acorde a los estándares actuales. No solo copiaremos una respuesta de un foro; entenderemos por qué cada método funciona como lo hace.

\n\n

Problema nº1: El punto flotante, tu amigo traicionero

\n\n

PHP, como la mayoría de los lenguajes, utiliza el formato IEEE 754 para números de punto flotante (float). Esto significa que 0.1 + 0.2 puede no ser 0.3, sino 0.30000000000000004. Y 19.95 multiplicado por 100 puede dar 1994.9999999999998. Si simplemente llamas a round(), obtendrás un resultado inesperado.

\n\n

Por eso, en 2025, la regla número uno es: no confíes en float para finanzas. Pero si solo necesitas formatear la salida (por ejemplo, un precio en un escaparate), los siguientes métodos son justo lo que necesitas.

\n\n

Método nº1: El clásico — number_format()

\n\n

Es la forma más popular y segura para el 99% de las tareas. La función number_format() no solo redondea, sino que formatea el número con separadores de miles y una cantidad determinada de decimales.

\n\n
<?php\n$price = 19.999999;\necho number_format($price, 2, '.', ''); // Muestra: 20.00\n\n$salary = 1234.5;\necho number_format($salary, 2, '.', ','); // Muestra: 1,234.50\n?>
\n\n

¿Por qué es genial?

\n
    \n
  • Redondea automáticamente al número de decimales indicado (siguiendo las reglas matemáticas).
  • \n
  • Permite definir tu propio separador de parte entera y decimal.
  • \n
  • Añade ceros si la parte decimal es más corta (por ejemplo, 5.00 en lugar de 5).
  • \n
\n\n

Detalle importante: Si le pasas una cadena, PHP intentará convertirla a número. Ten cuidado con las configuraciones regionales: una coma en la cadena podría no interpretarse como separador decimal.

\n\n

¿Cuándo usarlo?

\n

Para mostrar precios, salarios, porcentajes y cualquier dato que requiera dos decimales y separación de miles.

\n\n

Método nº2: Precisión matemática — round()

\n\n

La función round() devuelve un número (tipo float), no una cadena. Esto es importante si piensas hacer más cálculos con él.

\n\n
<?php\n$value = 45.6789;\n$rounded = round($value, 2); // 45.68 (float)\n\n// Pero, ¡ojo! Si necesitas exactamente dos decimales y un cero al final:\necho $rounded; // Muestra 45.68 (todo bien)\necho round(45.0, 2); // Muestra 45 (float), no 45.00\n?>
\n\n

La trampa: round() usa "redondeo bancario" (round half to even) por defecto en PHP 8+. Esto significa que 2.5 se redondeará a 2, y 3.5 a 4. Para finanzas, esto puede ser inaceptable. Usa la constante PHP_ROUND_HALF_UP para el redondeo clásico:

\n\n
<?php\necho round(2.5, 0, PHP_ROUND_HALF_UP); // 3\necho round(2.5, 0); // 2 (bancario)\n?>
\n\n

Conclusión: round() + number_format()

\n

El tándem perfecto: primero redondea para los cálculos, luego formatea para la salida.

\n\n
<?php\n$raw = 19.999999;\n$precise = round($raw, 2, PHP_ROUND_HALF_UP);\necho number_format($precise, 2, '.', ''); // 20.00\n?>
\n\n

Método nº3: La elegancia de sprintf()

\n\n

La función sprintf() es una potente herramienta de formateo de cadenas. ¿Descarta los decimales extra? No, también redondea, pero lo hace de forma diferente.

Blogs

Book Recommendations