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 paradouble
, ou parabool
em comparações relacionais e de igualdade. - Se não houver nenhum
double
tipo na expressão, a expressão será avaliada parafloat
, ou parabool
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
sufixod
é do tipodouble
- O literal com o sufixo
f
ouF
é do tipofloat
- O literal com o sufixo
m
ouM
é 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 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#: