Tipos numéricos de vírgula flutuante (referência C#)

Os tipos numéricos de vírgula flutuante representam números reais. Todos os tipos numéricos de vírgula flutuante são tipos de valor. Eles também são tipos simples e podem ser inicializados com literais. Todos os tipos numéricos de vírgula flutuante suportam operadores aritméticos, de comparação e de igualdade.

Características dos tipos de vírgula flutuante

O C# suporta os seguintes tipos de ponto flutuante predefinidos:

Tipo/palavra-chave C# Intervalo aproximado Precisão Tamanho Tipo .NET
float ±1,5 x 10−45 a ±3,4 x 1038 ~6-9 dígitos 4 bytes System.Single
double ±5,0 × 10−324 a ±1,7 × 10308 ~15-17 dígitos 8 bytes System.Double
decimal ±1,0 x 10-28 a ±7,9228 x 1028 28-29 dígitos 16 bytes System.Decimal

Na tabela anterior, cada palavra-chave de tipo C# da coluna mais à esquerda é um alias para o tipo .NET correspondente. São intercambiáveis. Por exemplo, as seguintes declarações declaram variáveis do mesmo tipo:

double a = 12.3;
System.Double b = 12.3;

O valor padrão de cada tipo de vírgula flutuante é zero, 0. Cada um dos tipos de vírgula flutuante tem as MinValue constantes e MaxValue que fornecem o valor finito mínimo e máximo desse tipo. Os float tipos e double também fornecem constantes que representam valores não-a-número e infinitos. Por exemplo, o double tipo fornece as seguintes constantes: Double.NaN, Double.NegativeInfinitye Double.PositiveInfinity.

O decimal tipo é adequado quando o grau de precisão exigido é determinado pelo número de algarismos à direita da casa decimal. Esses números são comumente usados em aplicações financeiras, para valores de moeda (por exemplo, $1,00), taxas de juros (por exemplo, 2,625%), e assim por diante. Mesmo números que são precisos para apenas um dígito decimal são manipulados com mais precisão pelo decimal tipo: 0.1, por exemplo, pode ser representado exatamente por uma decimal instância, enquanto não há nenhuma double instância OR float que represente exatamente 0.1. Devido a essa diferença nos tipos numéricos, erros de arredondamento inesperados podem ocorrer em cálculos aritméticos quando você usa double ou float para dados decimais. Você pode usar double em vez de decimal quando otimizar o desempenho é mais importante do que garantir a precisão. No entanto, qualquer diferença no desempenho passaria despercebida por todos, exceto pelos aplicativos mais intensivos em cálculo. Outra possível razão a evitar decimal é minimizar os requisitos de armazenamento. Por exemplo, ML.NET usa float porque a diferença entre 4 bytes e 16 bytes se soma para conjuntos de dados muito grandes. Para obter mais informações, veja System.Decimal.

Você pode misturar tipos integrais e os float tipos e em double uma expressão. Neste caso, os tipos integrais são implicitamente convertidos em um dos tipos de vírgula flutuante e, se necessário, o float tipo é implicitamente convertido em double. A expressão é avaliada da seguinte forma:

  • Se houver double tipo na expressão, a expressão será avaliada para double, ou para bool em comparações relacionais e de igualdade.
  • Se não houver nenhum double tipo na expressão, a expressão será avaliada para float, ou para bool em comparações relacionais e de igualdade.

Você também pode misturar tipos integrais e o decimal tipo em uma expressão. Neste caso, os tipos integrais são implicitamente convertidos para o decimal tipo e a expressão avalia para decimal, ou para bool em comparações relacionais e de igualdade.

Não é possível misturar o decimal tipo com os float tipos e double em uma expressão. Nesse caso, se você quiser executar operações aritméticas, de comparação ou de igualdade, deverá converter explicitamente os operandos de ou para o decimal tipo, como mostra o exemplo a seguir:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

Você pode usar cadeias de caracteres de formato numérico padrão ou cadeias de caracteres de formato numérico personalizado para formatar um valor de ponto flutuante.

Literais reais

O tipo de um literal real é determinado pelo seu sufixo da seguinte forma:

  • O literal sem sufixo ou com o ou D sufixo d é do tipodouble
  • O literal com o sufixo f ou F é do tipo float
  • O literal com o sufixo m ou M é do tipo decimal

O código a seguir demonstra um exemplo de cada um:

double d = 3D;
d = 4d;
d = 3.934_001;

float f = 3_000.5F;
f = 5.4f;

decimal myMoney = 3_000.5m;
myMoney = 400.75M;

O exemplo anterior também mostra o uso de como um separador de _ dígitos. Você pode usar o separador de dígitos com todos os tipos de literais numéricos.

Você também pode usar notação científica, ou seja, especificar uma parte expoente de um literal real, como mostra o exemplo a seguir:

double d = 0.42e2;
Console.WriteLine(d);  // output 42

float f = 134.45E-2f;
Console.WriteLine(f);  // output: 1.3445

decimal m = 1.5E6m;
Console.WriteLine(m);  // output: 1500000

Conversões

Há apenas uma conversão implícita entre tipos numéricos de vírgula flutuante: de float para double. No entanto, você pode converter qualquer tipo de ponto flutuante em qualquer outro tipo de ponto flutuante com o elenco explícito. Para obter mais informações, consulte Conversões numéricas internas.

Especificação da linguagem C#

Para obter mais informações, consulte as seguintes seções da especificação da linguagem C#:

Consulte também