Compartilhar via


Tipos numéricos de ponto flutuante (referência em C#)

Os tipos numéricos de ponto flutuante representam números reais. Todos os tipos numéricos de ponto 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 ponto flutuante dão suporte a operadores aritméticos, de comparação e de igualdade .

Características dos tipos de ponto flutuante

O C# dá suporte aos seguintes tipos de ponto flutuante predefinidos:

Tipo/palavra-chave em C# Intervalo aproximado Precisão Tamanho Tipo .NET
float ±1,5 x 10 a 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 a 29 dígitos 16 bytes System.Decimal

Na tabela anterior, cada palavra-chave do tipo C# da coluna mais à esquerda é um alias para o tipo .NET correspondente. Eles 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 ponto flutuante é zero. 0 Cada um dos tipos de ponto flutuante tem a e MaxValue as MinValue constantes que fornecem o valor finito mínimo e máximo desse tipo. Os float tipos e também double fornecem constantes que representam valores não numéricos e infinitos. Por exemplo, o double tipo fornece as seguintes constantes: Double.NaN, Double.NegativeInfinitye Double.PositiveInfinity.

O decimal tipo é apropriado quando o grau de precisão necessário é determinado pelo número de dígitos à direita do ponto decimal. Esses números são comumente usados em aplicativos financeiros, para valores de moeda (por exemplo, US$ 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 decimais são tratados com mais precisão pelo decimal tipo: 0.1, por exemplo, pode ser exatamente representado por uma decimal instância, enquanto não há nenhuma double instância que float represente exatamente 0,1. Devido a essa diferença em 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 com uso intensivo de cálculo. Outro motivo possível para evitar decimal é minimizar os requisitos de armazenamento. Por exemplo, ML.NET usa porque a diferença entre 4 bytes e 16 bytes se soma para conjuntos float de dados muito grandes. Para obter mais informações, consulte System.Decimal.

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

  • Se houver double tipo na expressão, a expressão será avaliada doublecomo , ou em bool comparações relacionais e de igualdade.
  • Se não houver nenhum double tipo na expressão, a expressão será avaliada floatcomo , 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. Nesse caso, os tipos integrais são convertidos implicitamente no decimal tipo e a expressão é decimalavaliada como , ou em bool comparações relacionais e de igualdade.

Você não pode misturar o decimal tipo com o tipo e double tipos float 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 literal real é determinado por seu sufixo da seguinte maneira:

  • O literal sem sufixo ou com o d sufixo é D do tipo double
  • O literal com o f sufixo ou F o sufixo é do tipo float
  • O literal com o m sufixo ou M o sufixo é 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 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 a notação científica, ou seja, especificar uma parte exponencial 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 ponto flutuante: de float para double. No entanto, você pode converter qualquer tipo de ponto flutuante em qualquer outro tipo de ponto flutuante com a conversão explícita. Para obter mais informações, consulte conversões numéricas internas.

Especificação da linguagem C#

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

Consulte também