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 você pode inicializá-los usando literais. Todos os tipos numéricos de ponto flutuante dão suporte a operadores aritméticos, de comparação e de igualdade .
A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para recursos em visualizações públicas para a próxima versão do idioma.
A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.
Dica
Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.
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 MinValue as MaxValue 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 passa 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 um
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 emboolcomparaçõ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 os float tipos 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 sufixo em um literal real determina seu tipo:
- Um literal sem sufixo ou com o
dsufixo éDumdouble. - Um literal com o
fsufixo ouFé umfloat. - Um literal com o
msufixo ouMé umdecimal.
O código a seguir mostra um exemplo de cada tipo:
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, que especifica 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 usando 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#: