Dois dígitos decimais em PHP: melhores métodos 2025

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que "simplesmente round()" não funciona mais? Um olhar para 2025

\n\n

Todo mundo que já escreveu uma loja virtual, um módulo contábil ou um parser de taxas de câmbio em PHP já se deparou com a pergunta: "Como exibir o número 19.9999999999999 como 20.00 de forma elegante?" No Stack Overflow, essa pergunta acumula milhares de visualizações, e não é à toa. Em 2025, com o PHP ostentando as versões 8.4 e superiores, os velhos truques com round() às vezes reservam surpresas dignas de um filme de terror.

\n\n

Vamos entender de uma vez por todas: como exibir um número com duas casas decimais em PHP de forma confiável, bonita e alinhada aos padrões modernos. Não vamos apenas copiar uma resposta de fórum — vamos entender por que cada método funciona exatamente como funciona.

\n\n

Problema nº1: Ponto flutuante — seu amigo traiçoeiro

\n\n

O PHP, como a maioria das linguagens, usa o formato IEEE 754 para números de ponto flutuante (float). Isso significa que 0.1 + 0.2 pode não ser igual a 0.3, mas sim a 0.30000000000000004. E 19.95 multiplicado por 100 pode resultar em 1994.9999999999998. Se você simplesmente chamar round(), terá um resultado inesperado.

\n\n

Portanto, em 2025, a regra número um é: não confie em float para finanças. Mas se você só precisa formatar a saída (por exemplo, o preço em uma vitrine), os métodos a seguir são exatamente o que o médico receitou.

\n\n

Método nº1: O clássico — number_format()

\n\n

Este é o método mais popular e seguro para 99% das tarefas. A função number_format() não apenas arredonda — ela formata o número com separadores de milhares e uma quantidade definida de casas decimais.

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

Por que isso é incrível:

\n
    \n
  • Arredonda automaticamente para o número especificado de casas (seguindo as regras matemáticas).
  • \n
  • Permite definir seu próprio separador para a parte inteira e decimal.
  • \n
  • Adiciona zeros se a parte decimal for mais curta (por exemplo, 5.00 em vez de 5).
  • \n
\n\n

Detalhe importante: Se você passar uma string, o PHP tentará convertê-la em número. Cuidado com localizações — uma vírgula na string pode ser interpretada como separador decimal.

\n\n

Quando usar?

\n

Para exibir preços, salários, porcentagens e quaisquer dados que precisem de duas casas decimais e separação de dígitos.

\n\n

Método nº2: Precisão matemática — round()

\n\n

A função round() retorna um número (tipo float), não uma string. Isso é importante se você for fazer cálculos adicionais.

\n\n
<?php\n$value = 45.6789;\n$rounded = round($value, 2); // 45.68 (float)\n\n// Mas! Se você precisa exatamente de duas casas e um zero no final:\necho $rounded; // Exibe 45.68 (tudo ok)\necho round(45.0, 2); // Exibe 45 (float), não 45.00\n?>
\n\n

Armadilha: O round() usa "arredondamento bancário" (round half to even) por padrão no PHP 8+. Isso significa que 2.5 será arredondado para 2, e 3.5 para 4. Para finanças, isso pode ser inaceitável. Use a constante PHP_ROUND_HALF_UP para o arredondamento clássico:

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

Conclusão: round() + number_format()

\n

A dupla perfeita: primeiro arredonde para os cálculos, depois formate para a exibição.

\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: A elegância do sprintf()

\n\n

A função sprintf() é uma ferramenta poderosa para formatação de strings. Ela não arredonda, mas sim trunca os dígitos extras? Não, ela também arredonda, mas faz isso de forma diferente. Vamos ver:

\n\n
<?php\n$value = 45.6789;\necho sprintf("%.2f", $value); // 45.68\n?>
\n\n

Vantagem: sprintf() é extremamente flexível e pode ser combinado com outras formatações de string. É ideal quando você precisa de controle total sobre a saída.

\n\n

Método nº4: A solução moderna — Classe Decimal

\n\n

Para quem trabalha com cálculos financeiros ou precisa de precisão absoluta, a extensão Decimal do PHP é a melhor escolha. Ela evita completamente os problemas de ponto flutuante.

\n\n
<?php\n$value = new Decimal('19.999999');\necho $value->toFixed(2); // 20.00\n?>
\n\n

Por que usar? Para cálculos onde cada centavo importa, como em sistemas de pagamento, contabilidade ou relatórios financeiros.

\n\n

Resumo: Qual método escolher?

\n
    \n
  • number_format(): Para exibição de dados com formatação de milhares e casas decimais.
  • \n
  • round(): Para arredondamento matemático antes de cálculos.
  • \n
  • sprintf(): Para formatação precisa de strings com controle total.
  • \n
  • Decimal: Para cálculos financeiros que exigem precisão absoluta.
  • \n
\n\n

Com essas ferramentas, você está pronto para lidar com qualquer desafio de formatação numérica em PHP em 2025. Lembre-se: a escolha do método certo depende do seu caso de uso específico. Teste sempre com valores de borda para garantir que o resultado seja exatamente o esperado.

Blogs

Book Recommendations