Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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. São também tipos simples, e podes inicializá-los usando literais. Todos os tipos numéricos de vírgula flutuante suportam operadores aritméticos, de comparação e de igualdade .
A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento linguístico.
A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.
Sugestão
Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.
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. 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 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 de desempenho passa despercebida por todas, exceto pelas aplicações mais exigentes 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, consulte 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 um
doubletipo na expressão, a expressão avalia paradouble, ou paraboolem comparações relacionais e de igualdade. - Se não
doublehouver tipo na expressão, a expressão avalia parafloat, ou paraboolem 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 podes misturar o decimal tipo com os float tipos e double numa 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 num literal real determina o seu tipo:
- Um literal sem sufixo ou com o
dsufixo ouDé umdouble. - Um literal com o
fsufixo orFé umfloat. - Um literal com o
msufixo orMé umdecimal.
O código seguinte 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 um separador de dígitos. Você pode usar o separador de dígitos com todos os tipos de literais numéricos.
Também pode usar notação científica, que especifica uma parte expoente de um literal real, como mostra o exemplo seguinte:
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
Existe apenas uma conversão implícita entre tipos numéricos de ponto flutuante: de float para double. No entanto, pode converter qualquer tipo de ponto flutuante para qualquer outro tipo de ponto flutuante usando o cast 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#: