Decimal vs Double em C#: o que escolher e quando? Guia 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

Decimal vs Double em C#: A batalha pela precisão (e seus nervos)



Você já escreveu uma calculadora de salário ou, digamos, um simulador de voo de bola, e de repente obteve 0.30000000000000004 em vez do esperado 0.3? Se sim — bem-vindo ao clube. A pergunta "decimal vs double! - Which one should I use and when?" é uma das mais populares no Stack Overflow, e não é à toa. Parece que é apenas uma escolha entre dois tipos de números de ponto flutuante. Mas, na verdade, é uma escolha entre um desastre financeiro e a precisão científica (ou vice-versa).



Neste artigo, vamos analisar esse debate eterno de uma vez por todas. Você aprenderá como o tipo decimal em C# difere do tipo double, onde aplicar cada um e, o mais importante — como não errar em 2025. Vamos lá!



Resumindo: o que está por baixo do capô?



Antes de começarmos a trocar argumentos, vamos dar uma olhada na especificação. Cada tipo tem sua própria arquitetura, e é ela que determina onde ele será rei e onde será pária.



Double (também conhecido como System.Double)

  • Tamanho: 64 bits (8 bytes).
  • Precisão: Aproximadamente 15-17 dígitos significativos.
  • Faixa: Enorme (de ±5.0 × 10−324 a ±1.7 × 10308).
  • Representação: Ponto flutuante conforme padrão IEEE 754 (binário).
  • Desempenho: Alto. Os processadores são otimizados para trabalhar com double.


Decimal (também conhecido como System.Decimal)

  • Tamanho: 128 bits (16 bytes).
  • Precisão: 28-29 dígitos significativos.
  • Faixa: Menor (de ±1.0 × 10−28 a ±7.9 × 1028).
  • Representação: Decimal (essencialmente, um número inteiro com deslocamento de vírgula).
  • Desempenho: Menor. Sem suporte de hardware na CPU, todos os cálculos são por software.


A principal diferença que você precisa lembrar: double é uma fração binária, enquanto decimal é decimal. É por isso que surgem os famosos "erros de arredondamento".



Por que o double "quebra" o dinheiro, mas é ideal para a ciência?



Imagine que você está tentando escrever o número 0.1 no sistema binário. Será uma fração periódica infinita: 0.0001100110011.... O computador a trunca, e obtém-se um pequeno, mas crítico, erro. Para cálculos científicos (simulações climáticas, física, gráficos), esse erro se acumula, mas dentro de limites aceitáveis. Para finanças — é um "centavo roubado" de um milhão de usuários.



O decimal, por outro lado, armazena o número como um inteiro (por exemplo, 1/10 = 0.1 é armazenado como o número inteiro 1 e a informação de que a vírgula deve ser deslocada uma casa). Portanto, a precisão do decimal é ideal para frações decimais.



Quando usar decimal em C#? (Spoiler: para dinheiro)



A regra de ouro que salvará seu projeto: use decimal para cálculos financeiros, monetários e contábeis. Se em sua variável estão reais, dólares, juros de empréstimo ou IVA — sua escolha é inequívoca.



Aqui está um exemplo de por que double é o mal para o bolso:



using System;

public class MoneyExample{ public static void Main() { // Exemplo ruim com double double price = 10.99; double tax = 0.07; double totalDouble = price + (price * tax); Console.WriteLine($"Double total: {totalDouble}"); // Pode resultar em 11.759300000000001

// Exemplo bom com decimal decimal priceDec = 10.99m; decimal taxDec = 0.07m; decimal totalDec = priceDec + (priceDec * taxDec); Console.WriteLine($"Decimal total: {totalDec}"); // Exato: 11.7593 }}


Viu esse "extra

Blogs

Book Recommendations