• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Back-end
    3. PHP: operação com números decimais.

    PHP: operação com números decimais.

    8 min8 minutos de leitura

    8 min8 minutos de leitura

    Publicado: 17/12/2019

    1. Realizando operações com Float
    2. Utilizando valores inteiros
    3. Fazendo operações com a extensão Decimal

    Operações com ponto flutuante podem ser uma grande dor de cabeça em diversas linguagens, e não é diferente no PHP. Um simples 0.1 + 0.2 pode dar uma resposta inesperada. Como ter uma precisão que queremos?

    Recentemente estive trabalhando em um programa para que eu possa gerenciar o dinheiro que entra e sai da minha conta bancária, guardando informações sobre cada transação de débito e crédito.

    Para armazenarmos estas informações, vamos iniciar criando um arquivo PHP com um array que armazenará o débito e o crédito:

    
    <?php
    $debitos = array();
    $creditos = array();
    ?>
    

    Agora, como realizei um pagamento de R$0,10, adicionamos a seguinte linha no programa, para adicionar o valor no array de débitos:

    array_push($debitos, 0.1);
    

    E mais tarde, realizei outro pagamento de R$0,20, então adicionamos também mais uma linha:

    array_push($debitos, 0.2);
    

    No final do dia eu recebi um pagamento de R$0,30, então adicionei um valor no array de créditos do programa:

    array_push($creditos, 0.3);
    

    Por enquanto, o nosso código ficou assim:

    <?php
    $debitos = array();
    $creditos = array();
    array_push($debitos, 0.1);
    array_push($debitos, 0.2);
    array_push($creditos, 0.3);
    ?>
    

    Agora, preciso consultar o meu saldo e exibí-lo na tela, vamos criar uma função para calcular isso, adicionamos no final do programa:

    function saldo(array $debitos, array $creditos) {
    return array_sum($creditos) - array_sum($debitos);
    }
    

    Para consultarmos o saldo, vamos imprimir na tela o resultado da função. Chamamos a função e passamos os arrays de débito e crédito como argumento:

    echo saldo($debitos, $creditos);
    O código completo do programa ficou:
    <?php
    $debitos = array();
    $creditos = array();
    array_push($debitos, 0.1);
    array_push($debitos, 0.2);
    array_push($creditos, 0.3);
    function saldo(array $creditos, array $debitos) {
    	return array_sum($creditos) - array_sum($debitos);
    }
    echo saldo($creditos, $debitos);
    ?>
    

    E se executarmos o programa, tanto pelo terminal quanto pela web, vamos ver que a saída do programa ficou:

    O que aconteceu? Esperávamos que o resultado fosse zero, mas não foi isso que tivemos como resultado.

    Realizando operações com Float

    Quando tratamos com dinheiro em nossos programas, precisamos do máximo de precisão que pudermos obter, pois erros em operações financeiras podem causar prejuízos. Além disso, temos que tomar cuidado com valores do tipo Float, que são números que possuem um ponto flutuante.

    O problema que enfrentamos é que a aritmética que usamos (base 10) é diferente da que o computador utiliza (base 2), e a conversão entre elas pode causar erros de precisão.

    Em números de base 2, com um dígito, podemos representar dois números (0 e 1). Com dois dígitos 2² podemos representar 4 números (0 a 3), com três dígitos, 2³ = 8 (0 a 7) e por assim vai.

    Em números de base 10, com um dígito, podemos representar 10 números (0 a 9), com dois dígitos podemos representar 10² = 100 números (0 a 99). Com a base 10, representamos mais números com menos dígitos, tendo uma precisão melhor.

    Como o computador só entende números binários (base 2), tudo que digitamos nele vira uma sequência de 0 e 1 para que o processador possa interpretar.

    Para exemplificar a diferença entre um número em binário e decimal (base 10), vamos pegar por exemplo o número 1025 que em binário, fica 10000000001, precisando de onze dígitos, mas em decimal, seriam utilizados apenas quatro dígitos (1, 0, 2 e 5).

    Normalmente não percebemos este erro por acabarmos não utilizando toda esta precisão para representar números mais simples. Mas quando obtemos algo como uma dízima periódica, ou usamos operadores de comparação, vemos que o arredondamento acontece e causa problemas pois ela é infinita, e a memória do computador é finita, então o arredondamento tem que acontecer em um ponto por questões de arquitetura do processador.

    E, no caso de dinheiro, precisamos desta precisão que números base 10 oferecem, então float não é o tipo de dado ideal para esta situação por conta de sua precisão. Uma das maneiras que podemos contornar isso é usar ao invés do float, um tipo de dados que não tem arredondamento como o tipo Int.

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Utilizando valores inteiros

    Podemos usar o menor valor de uma moeda (no caso do real, utilizamos o centavo, por ele não poder ser dividido) e armazenamos ele no programa como tipo Int, e fazemos todas as operações nessa unidade, pois o tipo nt não tem arredondamento que nem o Float, portanto não estará sujeito a perda de precisão devido ao arredondamento.

    Utilizando o programa que construímos como exemplo, o código dele ficaria assim:

    <?php
    $debitos = array();
    $creditos = array();
    array_push($debitos, 10); #Trocamos o valor 0.1 para 10, representando os centavos.
    array_push($debitos, 20); #Fazemos a mesma coisa, trocando 0.2 para 20.
    array_push($creditos, 30); #Trocamos o valor 0.3 para 30.
    function saldo(array $creditos, array $debitos) {
        return array_sum($creditos) - array_sum($debitos);
    }
    $saldo = saldo($creditos, $debitos);
    echo number_format($saldo, 2, ',', '.');
    ?>
    

    Mas como estamos tratando como centavos, assim que quisermos representar ele como real, tratamos somente na saída.

    number_format($saldo, 2, ',', '.');
    

    Podemos utilizar a função number_format do PHP para exibir os centavos armazenados internamente de uma maneira correta na tela.

    Perfeito! Assim não temos mais problemas com a precisão, podemos utilizar números inteiros para tudo então?

    Um problema que ocorre com esta abordagem é que o Int possui um valor máximo, no caso do PHP, o número máximo dos valores inteiros vai depender da arquitetura para qual o PHP foi compilado.

    Se for 32-bit, o valor máximo é de R$ 21.474.836,48 (mais ou menos 21 milhões de reais) e se for 64-bit, o valor máximo é de R$ 92.233.720.368.547.758,07 (92 quatrilhões de reais).

    Vale lembrar que o PHP não suporta tipos inteiros unsigned (onde só existem números positivos), ou seja, esse máximo vale tanto para um valor positivo quanto negativo. Você pode descobrir qual o limite na sua instalação do PHP imprimindo a constante PHP_INT_MAX.

    Esta solução é boa se você sabe que não vai esbarrar no limite máximo do inteiro, pois assim que este limite for excedido, no PHP, o valor começa a ser tratado como Float.

    No caso de dinheiro, não podemos correr o risco deste valor virar um Float e perdermos precisão. Então podemos explorar mais uma solução, usar a extensão Decimal.

    Fazendo operações com a extensão Decimal

    Em uma empresa que possui um programa que gerencia o movimento de fluxos de caixa com valores enormes, pode acontecer de precisarmos armazenar um valor maior do que tipos inteiros oferecem na nossa arquitetura. A extensão Decimal é uma extensão para o PHP 7 que provê um objeto do tipo decimal para a linguagem, que é a maneira recomendada de lidarmos com este tipo de situação.

    Para instalá-la, precisaremos utilizar o PECL, que é o gerenciador de pacotes que vem com o PHP, diferente do Composer, que é responsável por baixar bibliotecas PHP, o PECL é responsável por extensões C feitas para a linguagem em si.

    pecl install decimal
    

    Isso vai compilar o PHP com esta extensão, se tudo der certo, você pode adicionar no php.ini a seguinte linha para ativá-la.

    extension=decimal
    

    Para que esta extensão funcione, ela precisa do pacote libmpdecimal instalado,ou se estiver usando uma distribuição Linux, execute o seguinte comando:

    sudo apt-get install libmpdec-dev
    

    É interessante lembrar que esta extensão tem uma dependência na extensão de JSON do PHP, então ela deve ser adicionada depois desta extensão. Se você estiver em uma distribuição Linux como o Debian ou Ubuntu, edite o seguinte arquivo (se ele não existir, crie):

    /etc/php/7.2/mods-available/decimal.ini
    

    Agora, para que o PHP consiga visualizar a extensão Decimal, precisamos colocar nesse arquivo que criamos, o nome da extensão e a prioridade:

    ; priority=30
    extension=decimal
    

    Agora podemos utilizar o tipo Decimal! Ele está dentro do namespace com o nome de Decimal. Então para utilizá-lo, precisaremos adicionar a seguinte linha no começo do programa:

    use Decimal\Decimal;
    

    Então, podemos instanciar a classe Decimal com uma string contendo o valor que queremos representar, por exemplo:

    $decimal = new Decimal(“0.1”);
    

    Utilizando o nosso primeiro exemplo e adaptando ele para utilizar o tipo Decimal, ficaria assim:

    <?php
    use Decimal\Decimal;
    $debitos = array();
    $creditos = array();
    array_push($debitos, new Decimal("0.1"));
    array_push($debitos, new Decimal("0.2"));
    array_push($creditos, new Decimal("0.3"));
    function saldo(array $creditos, array $debitos) {
        return array_sum($creditos) - array_sum($debitos);
    }
    echo saldo($creditos, $debitos);
    ?>
    

    E se executarmos, podemos ver que a saída será exibida corretamente:

    Se desejar saber mais sobre números de precisão, recomendo o website Floating Point Guide (em inglês), que mantém um guia sobre tudo que um programador precisa saber sobre precisão numérica.

    Outro site interessante para quem quiser saber mais sobre como essas coisas funcionam no PHP específicamente é a documentação oficial do PHP na parte de floats.

    Vimos que, para obtermos uma maior precisão numérica, o Float não é um tipo de dado recomendado por ele arredondar valores.

    Vimos também que o tipo Int não possui arredondamento, e que ele é uma solução preferível ao Float, mas ele possui limitações em seu tamanho máximo.

    Além disso, sabemos agora que o tipo Decimal, instalável através de uma extensão, é o tipo recomendado para tratar com valores de uma maneira mais precisa.

    Você gostou do que leu? Aqui na Alura temos uma formação PHP,você vai aprender desde os fundamentos da linguagem junto com as boas práticas e o essencial conhecimento de uma boa modelagem orientada a objetos.!

    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de Giovanni Tempobono

      Autor(a)

      Giovanni Tempobono

      Giovanni é instrutor na Alura e desenvolvedor de software. Possui um bacharel em Ciência da Computação pelo Mackenzie e gosta muito de conhecer novas linguagens e tecnologias.

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • 28/04/2016

      O que um arquivo .java precisa para compilar?

      Ler mais
    • 25/07/2022

      Quer ter uma experiência real em Back-End? Esse challenge é feito pra você!

      Ler mais
    • 12 de Maio

      TypeScript: quando usar unknown em vez de any?

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura