Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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
doubletipo na expressão, a expressão será avaliadadoublecomo , ou emboolcomparações relacionais e de igualdade. - Se não houver nenhum
doubletipo na expressão, a expressão será avaliadafloatcomo , ou paraboolem 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
dsufixo éDdo tipodouble - O literal com o
fsufixo ouFo sufixo é do tipofloat - O literal com o
msufixo ouMo sufixo é do tipodecimal
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#: