This article has been localized into Portuguese by the community.
Pontos flutuantes
Os números de ponto flutuante são números que possuem partes fracionárias (normalmente expressas com um ponto decimal). Você pode se perguntar por que não há apenas um único tipo de dados para lidar com números (frações ou sem frações), mas isso é porque é muito mais rápido para o computador lidar com números inteiros do que com números que contêm frações. Portanto, faz sentido distinguir entre eles - se você sabe que estará lidando apenas com números inteiros, escolha um tipo de dado inteiro. Caso contrário, use um dos tipos de dados de ponto flutuante, conforme descrito neste artigo.
Usar um valor de ponto flutuante é tão fácil quanto usar um inteiro, mesmo que haja muito mais preocupações com valores de ponto flutuante, o que discutiremos mais adiante. Por enquanto, vamos ver o que parece ao declarar um dos tipos de dados de ponto flutuante mais usados: o duplo .
double number;
Assim como um inteiro, é claro que você pode atribuir um valor a ele ao mesmo tempo que declara:
double number = 42.0;
O mesmo vale para os tipos float e decimal, que serão discutidos em apenas um segundo, mas aqui a notação é um pouco diferente:
double doubleVal = 42.0;
float floatVal = 42.0f;
decimal decimalVal = 42.0m;
Observe o "f" e "m" após os números - ele diz ao compilador que estamos atribuindo um float e um valor decimal. Sem ele, o C # interpretará os números como duplos, que não podem ser automaticamente convertidos nem em um float nem em um decimal.
float, double ou decimal?
Lidar com valores de ponto flutuante na programação sempre causou muitas dúvidas e preocupações. Por exemplo, C # tem pelo menos três tipos de dados para lidar com números não inteiros/não inteiros:
- float (um apelido para System.Single)
- double (um apelido para System.Double)
- decimal (um alias para System.Decimal)
A diferença subjacente pode ser um pouco difícil de entender, a menos que você tenha muito conhecimento sobre como um computador funciona internamente, então vamos nos ater ao material mais prático aqui.
Em geral, a diferença entre os tipos de dados float, double e decimal está na precisão e, portanto, também na quantidade de memória usada para retê-los. O float é o menos caro - pode representar um número com até 7 dígitos. O duplo é mais preciso, com até 16 dígitos, enquanto o decimal é o mais preciso, com um máximo de 29 dígitos.
Você pode se perguntar o que você precisa de toda essa precisão, mas a resposta é "matemática". O exemplo clássico para entender a diferença é dividir 10 com 3. A maioria de nós fará isso na cabeça e dirá que o resultado é 3.33, mas muitas pessoas também sabem que não é totalmente preciso. A resposta real é 3.33 seguido por uma quantidade extra de 3 - quantos, ao fazer este cálculo com C #, são determinados pelo tipo de dados. Confira este exemplo:
float a = 10f / 3;
Console.WriteLine(a);
double b = 10d / 3;
Console.WriteLine(b);
decimal c = 10m / 3;
Console.WriteLine(c);
Eu faço exatamente o mesmo cálculo, mas com diferentes tipos de dados. O resultado será assim:
a: 3.333333
b: 3.33333333333333
c: 3.3333333333333333333333333333
A diferença é bem clara, mas quanta precisão você realmente precisa para a maioria das tarefas?
Como escolher
Primeiro de tudo, você deve considerar quantos dígitos você precisa armazenar. Um float só pode conter 7 dígitos, então se você precisar de um número maior que esse, você pode querer ir com um double ou decimal.
Em segundo lugar, tanto o float quanto o double representarão valores como uma aproximação do valor real - em outras palavras, pode não ser comparável ao último dígito. Isso também significa que, uma vez que você comece a fazer mais e mais cálculos com essas variáveis, elas podem não ser mais tão precisas, o que basicamente significa que dois valores que devem ser verificados como iguais de repente não serão iguais.
Portanto, para situações em que a precisão é a principal preocupação, você deve usar o tipo decimal . Um ótimo exemplo é representar números financeiros (dinheiro) - você não quer adicionar 10 valores em sua contabilidade, apenas para descobrir que o resultado não é o esperado. Por outro lado, se o desempenho é mais importante, você deve ir com um float (para números pequenos) ou um double (para números maiores). Um decimal é, graças à sua precisão extra, muito mais lento que um flutuador - alguns testes mostram que é até 20 vezes mais lento!
Resumo
Ao lidar com valores de ponto flutuante, você deve usar um tipo de dado float ou double quando a precisão for menos importante que o desempenho. Por outro lado, se você quer o máximo de precisão e está disposto a aceitar um nível mais baixo de desempenho, você deve usar o tipo de dados decimal - especialmente quando se lida com números financeiros.
Se você quer saber mais sobre as diferenças subjacentes entre este tipos de dados, em um nível muito mais detalhado, você deveria dar uma olhada neste artigo vem detalhado: What Every Computer Scientist Should Know About Floating-Point Arithmetic