Como usar números inteiros e de ponto flutuante em C#
Este tutorial ensina tipos numéricos em C#. Você escreverá pequenas quantidades de código, depois compilará e executará esse código. O tutorial contém uma série de lições que exploram números e operações matemáticas em C#. Estas lições ensinam os princípios básicos da linguagem C#.
Dica
Para colar um snippet de código dentro do modo de foco, você deve usar o atalho de teclado (Ctrl + v ou cmd + v).
Pré-requisitos
Este tutorial espera que você tenha um computador configurado para desenvolvimento local. Consulte Configurar seu ambiente local para obter instruções de instalação e uma visão geral do desenvolvimento de aplicativos no .NET.
Se você não quiser configurar um ambiente local, consulte a versão interativa no navegador deste tutorial.
Explorar a matemática de inteiros
Crie um diretório chamado numbers-quickstart. Torne esse o diretório atual e execute o seguinte comando:
dotnet new console -n NumbersInCSharp -o .
Importante
Os modelos C# para o .NET 6 usam instruções de nível superior. Se você já tiver atualizado para o .NET 6, talvez seu aplicativo não corresponda ao código descrito neste artigo. Para obter mais informações, consulte o artigo sobre Novos modelos C# geram instruções de nível superior
O SDK do .NET 6 também adiciona um conjunto de diretivas implícitasglobal using
para projetos que usam os seguintes SDKs:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
Essas diretivas implícitas global using
incluem os namespaces mais comuns para o tipo de projeto.
Para obter mais informações, consulte o artigo sobre Diretivas de uso implícito
Abra Program.cs em seu editor favorito e substitua o conteúdo do arquivo pelo seguinte código:
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
Execute este código digitando dotnet run
na janela de comando.
Você viu apenas uma das operações matemáticas fundamentais com números inteiros. O tipo int
representa um inteiro, zero, um número inteiro positivo ou negativo. Você usa o símbolo +
para adição. Outras operações matemáticas comuns para inteiros incluem:
-
para subtração*
para multiplicação/
para divisão
Comece explorando essas diferentes operações. Adicione estas linhas após a linha que grava o valor de c
:
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
Execute este código digitando dotnet run
na janela de comando.
Você também pode experimentar executar várias operações matemáticas na mesma linha, se quiser. Experimente c = a + b - 12 * 17;
, por exemplo. É permitido misturar variáveis e números constantes.
Dica
À medida que explora C# (ou qualquer linguagem de programação), você cometerá erros ao escrever o código. O compilador encontrará esses erros e os reportará a você. Quando a saída contiver mensagens de erro, analise atentamente o código de exemplo e o código em sua janela para ver o que deve ser corrigido. Esse exercício ajudará você a conhecer a estrutura do código C#.
Você terminou a primeira etapa. Antes de iniciar a próxima seção, vamos passar o código atual para um método separado. Um método é uma série de instruções agrupadas que receberam um nome. Você nomeia um método escrevendo o nome do método seguido por ()
. Organizar seu código em métodos torna mais fácil começar a trabalhar com um novo exemplo. Quando você terminar, seu código deverá ter a seguinte aparência:
WorkWithIntegers();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
A linha WorkWithIntegers();
invoca o método. O código a seguir declara o método e o define.
Explorar a ordem das operações
Comente a chamada para WorkingWithIntegers()
. Isso tornará a saída menos congestionada enquanto você trabalha nesta seção:
//WorkWithIntegers();
O //
inicia um comentário em C#. Os comentários são qualquer texto que você queira manter em seu código-fonte, mas não queria executar como código. O compilador não gera nenhum código executável a partir dos comentários. Como WorkWithIntegers()
é um método, você precisa apenas comentar uma linha.
A linguagem C# define a precedência de operações matemáticas diferentes com regras consistentes às regras que você aprendeu em matemática. Multiplicação e divisão têm precedência sobre adição e subtração. Explore isso adicionando o seguinte código a WorkWithIntegers()
após a chamada e executando dotnet run
:
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
A saída demonstra que a multiplicação é executada antes da adição.
Você pode forçar uma ordem diferente de operações, adicionando parênteses para delimitar a operação, ou operações, que você quer realizar primeiro. Adicione as seguintes linhas e execute novamente:
d = (a + b) * c;
Console.WriteLine(d);
Explore mais, combinando várias operações diferentes. Adicione algo semelhante às linhas a seguir. Tente dotnet run
novamente.
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
Talvez você tenha observado um comportamento interessante com relação aos números inteiros. A divisão de inteiros sempre produz um resultado inteiro, mesmo quando você espera que o resultado inclua uma parte decimal ou fracionária.
Se você ainda não viu esse comportamento, tente o seguinte:
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
Digite dotnet run
novamente para ver os resultados.
Antes de avançarmos, pegue todo código que você escreveu nesta seção e coloque-o em um novo método. Chame esse novo método de OrderPrecedence
. Seu código deve ter a seguinte aparência:
// WorkWithIntegers();
OrderPrecedence();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
void OrderPrecedence()
{
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
d = (a + b) * c;
Console.WriteLine(d);
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
}
Explorar a precisão de inteiros e limites
Esse último exemplo mostrou que uma divisão de inteiros trunca o resultado. Você pode obter o restante usando o operador module, o caractere %
. Tente o seguinte código após a chamada de método para OrderPrecedence()
:
int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");
O tipo de inteiro C# difere do inteiros matemáticos de outra forma: o tipo int
tem limites mínimo e máximo. Adicione este código para ver esses limites:
int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");
Se um cálculo produzir um valor que excede esses limites, você terá uma condição de estouro negativo ou estouro. A resposta parece quebrar de um limite para o outro. Adicione estas duas linhas para ver um exemplo:
int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");
Observe que a resposta é muito próxima do mínimo inteiro (negativo). É o mesmo que min + 2
. A operação de adição estourou os valores permitidos para números inteiros. A resposta é um número negativo muito grande, pois um estouro "envolve" do maior valor de inteiro possível para o menor.
Há outros tipos numéricos com limites e precisão diferentes que você usaria quando o tipo int
não atendesse às suas necessidades. Vamos explorar esses outros tipos em seguida. Antes de iniciar a próxima seção, mova o código que você escreveu nesta seção para um método separado. Nomeie-o como TestLimits
.
Trabalhar com o tipo Double
O tipo numérico double
representa um número de ponto flutuante de precisão dupla. Esses termos podem ser novidade para você. Um número de ponto flutuante é útil para representar números não integrais que podem ser muito grandes ou pequenos em magnitude. Precisão dupla é um termo relativo que descreve o número de dígitos binários usados para armazenar o valor. Os números de precisão dupla têm o dobro do número de dígitos binários do que os de precisão simples. Em computadores modernos, é mais comum usar números de precisão dupla do que de precisão simples. Números de precisão simples são declarados usando a palavra-chave float
. Vamos explorar. Adicione o seguinte código e veja o resultado:
double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);
Observe que a resposta inclui a parte decimal do quociente. Experimente uma expressão ligeiramente mais complicada com duplos:
double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);
O intervalo de um valor duplo é muito maior do que valores inteiros. Experimente o código a seguir abaixo do código que você escreveu até o momento:
double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");
Esses valores são impressos em notação científica. O número à esquerda do E
é o significando. O número à direita é o expoente, como uma potência de 10. Assim como os números decimais em matemática, os duplos em C# podem ter erros de arredondamento. Experimente esse código:
double third = 1.0 / 3.0;
Console.WriteLine(third);
Você sabe que 0.3
repetido um número finito de vezes não é exatamente o mesmo que 1/3
.
Desafio
Experimente outros cálculos com números grandes, números pequenos, multiplicação e divisão usando o tipo double
. Experimente cálculos mais complicados. Após algum tempo no desafio, pegue o código que você escreveu e coloque-o em um novo método. Chame esse novo método de WorkWithDoubles
.
Trabalhar com tipos decimais
Você viu os tipos numéricos básicos em C#: inteiros e duplos. Ainda há outro tipo: o tipo decimal
. O tipo decimal
tem um intervalo menor, mas precisão maior do que double
. Vamos dar uma olhada:
decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");
Observe que o intervalo é menor do que o tipo double
. Veja a precisão maior com o tipo decimal experimentando o código a seguir:
double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);
decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);
O sufixo M
nos números é o modo como você indica que uma constante deve usar o tipo decimal
. Caso contrário, o compilador assumirá o tipo double
.
Observação
A letra M
foi escolhida como a letra mais visualmente distinta entre as palavras-chave double
e decimal
.
Observe que o cálculo usando o tipo decimal tem mais dígitos à direita da vírgula decimal.
Desafio
Agora que você viu os diferentes tipos numéricos, escreva um código que calcula a área de um círculo cujo raio é de 2,50 centímetros. Lembre-se de que a área de um círculo é o quadrado do raio multiplicado por PI. Uma dica: o .NET contém uma constante para PI, Math.PI, que você pode usar para esse valor. Math.PI, como todas as constantes declaradas no namespace System.Math
, é um valor double
. Por esse motivo, você deve usar valores double
em vez de decimal
para esse desafio.
Você deve obter uma resposta entre 19 e 20. Confira sua resposta analisando o código de exemplo finalizado no GitHub.
Experimente outras fórmulas, se quiser.
Você concluiu o início rápido "Números em C#". Continue com o início rápido Branches e loops em seu próprio ambiente de desenvolvimento.
Saiba mais sobre os números em C# nos artigos a seguir: