¿Por qué «simplemente round()» ya no funciona? Una mirada al 2025
\n\nCualquiera 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.
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\nProblema nº1: El punto flotante, tu amigo traicionero
\n\nPHP, 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.
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\nMétodo nº1: El clásico — number_format()
\n\nEs 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.
<?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
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?
\nPara mostrar precios, salarios, porcentajes y cualquier dato que requiera dos decimales y separación de miles.
\n\nMétodo nº2: Precisión matemática — round()
\n\nLa función round() devuelve un número (tipo float), no una cadena. Esto es importante si piensas hacer más cálculos con él.
<?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\nLa 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:
<?php\necho round(2.5, 0, PHP_ROUND_HALF_UP); // 3\necho round(2.5, 0); // 2 (bancario)\n?>\n\nConclusión: round() + number_format()
\nEl 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\nMétodo nº3: La elegancia de sprintf()
\n\nLa 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.