Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

Os tipos float e double - números decimais (ou reais) em C

No artigo passado de nosso curso de C, estudamos sobre o tipo inteiro (int), como declarar, imprimir e inicializar tal tipo de dado.

Agora faremos o mesmo, mas para os números decimais, também conhecidos como números reais, que são os tipos float e double.

O que são e para que servem os tipos float e double

Em nosso dia-a-dia, muitas vezes usamos dados em forma de números decimais, como por exemplo:
o rendimento da poupança (0,57%, 1,01%),
valores monetários (R$ 1,99) ,
as notas da faculdade (10,0 , 5,4 , 0,5),
constantes e outrs números matemáticos ( pi = 3,14...) etc.

Não podemos, porém, armazenar essas informações em variáveis inteiras na linguagem C.
Ao invés disso, precisamos declarar usando os tipos de dados float e double, que são tipos especialmente feitos para que possamos trabalhar com números reais (decimais).

Vamos aprender como usar tais tipos de variáveis neste artigo de nossa apostila de C.

Como declarar e inicializar variáveis do tipo float e double na linguagem C

Lembre-se que, para inteiros, declaramos da seguinte maneira: int idade, int mes etc.

Analogamente, para floats e double:
float pi;
float juros;
double tamanho_de_uma_bacteria;
double area_de_uma_circunferencia;

A declaração também não é diferente da que fizemos com inteiros.
Podemos inicializar valores tanto na declaração das variáveis como somente depois:
float pi = 3.14;
double juros = 1.32101;

Ou
float pi;
double juros;
pi = 3.14;
juros = 1.32101;


Se você é novo no mundo da programação e nunca teve contato com uma língua estrangeira, certamente achará tais inicializações de variáveis estranha. Mas esse é uma regra bem importante:
Na linguagem de programação C, usamos o PONTO (.), e não a vírgula para separar a parte inteira da decimal.

Ou seja, no Brasil escrevemos: 1,99 e 0,57
Em programação é: 1.99 e 0.57


Qual a diferença entre float e double

Em nossos exemplos, usamos tanto float como double para representar números reais.
Temos, então, duas opções iguais para representar esses números decimais? Na verdade não, há uma diferença.

Variáveis float exigem, geralmente, 4 bytes de memória para serem armazenadas enquanto double necessitam de 8 bytes.
Essa diferença serve para termos uma melhor precisão na hora de realizar cálculos.

O número PI, por exemplo, é irracional. Ou seja, ela possui uma quantidade INFINITA de casas decimais.
Obviamente, uma cálculo com o uso do pi nunca é totalmente preciso. Além do mais, computadores tem uma quantidade de memória limitada.

Então, nos seus trabalhos escolares você deve declarar e usar uma variável do tipo float para representar o número pi:
float pi = 3.14;
Se quiser ser mais preciso pode fazer até: pi = 3.1415;

Já um Engenheiro Civil ou um Físico da NASA terá que usar uma precisão maior, pois quanto mais casas decimais, mais correto

será seu resultado. Então, eles usariam:
double pi = 3,14159265358979323

Ok, agora você sabe a diferença entre um float e um double - apenas a precisão.
Mas qual a diferença entre 0 e 0.0? E a diferença de 1 e 1.00?

Você sabe que um inteiro ocupa 2 bytes na memória, e que um float ocupa 4 bytes.
Além do tamanho alocado em sua máquina, qual outra diferença que faz esses valores diferentes?
Sim, o ponto. Ou seja, a parte decimal.

Fazer: int erro = 0
É totalmente diferente de: float erro = 0.0;

Uma vez declarado um inteiro, não poderá usar decimais nele. Mesmo sabendo que 0 = 0.0
Já os decimais podem ser trabalhados com inteiros.
Por exemplo:
double erro = 0.00
int juros = 1

Podemos fazer: juros + erro = 1.00
Ou seja, quando fazemos uma operação matemática de um decimal com inteiro, obteremos sempre um decimal.
Assim, o resultado dessa operação deverá sempre ser armazenado em um float ou em um double.
Veremos mais sobre isso quando estudarmos operações matemáticas na linguagem C.


Imprimindo números reais float e double na tela através do printf

Vimos na aula passada que representamos inteiros como %d dentro das aspas, de um printf.

Para variáveis decimais ou reais, como o float e o double usamos: %f
Vejamos um exemplo que mostra um valor de pi com precisão simples (float) e outro com precisão dupla(double):

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %f\n", pi );
    printf("Valor de pi mais preciso %f\n", piDouble );
}

Aqui notamos uma coisa curiosa no segundo valor, é exibido: 3.141593
Ou seja, o C não mostrou todo o valor da variável double 'piDouble' e ainda arredondou!

Podemos resolver isso da seguinte maneira. Supondo que você queira que seja exibido 6 casas decimais:
Ao invés de usar '%f' coloque: '%.7f'
Ou seja, esse 0.7f diz ao C o seguinte "Após o ponto, exiba 7 casas decimais".
Teste e veja o resultado:

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %f\n", pi );
    printf("Valor de pi mais preciso %.7f\n", piDouble );
}


Será exibido: 3.1415927

Agora veja o seguinte: a variável 'pi' tem somente duas casas decimais depois do ponto.
O que ocorre se eu ordenar ao printf que imprima com 5 casas decimais?
Programe e veja você o que acontece:

#include <stdio.h>

int main()
{
    float pi = 3.14;
    double piDouble = 3.1415926535897932384626433832795;
    printf("Valor de pi %.5f\n", pi );
    printf("Valor de pi mais preciso %.7f\n", piDouble );
}


Como imprimir números na forma exponencial em C

Outra maneira de imprimir variáveis decimais é usando exponenciais.
Podemos inicializar uma variável da seguinte maneira:
float numero = xEy;

Isso significa: x vezes 10 elevado a y = x * 10^y
Ou seja, 1E6 = 1 vezes 10^6 = 1 milhão

E float numero = xE-y
Significa: x vezes 10 elevado a -y = x * 10^(-y)
Por exemplo: 2E-3 = 2 vezes 10^(-3) = 0.002

Veja o seguinte código e tente adivinhar sua saída. Logo após, rode o programa para vê se acertou:


#include <stdio.h>

int main()
{
    float salarioSonho = 1E6,
           salarioReal = 10E-3;
    printf("Sonhei que meu salario era de R$%.2f, \nmas acordei e lembrei que era %.2f centavos", salarioSonho, salarioReal);
}

Nesse último exemplo, note como declaramos mais de uma varíável.
Em vez de fazer:
float variavel1;
float variavel2;
float variavel3.

Você pode fazer:
float variavel1, variavel2, variavel3;

Ou, para ficar mais legível:
float variavel1,
       variavel2,
       variavel3.

22 comentários:

Anônimo disse...

Olá,

estou conhecendo o site hoje e gostaria de "curtir" no Facebook. Mas não encontrei a página. Tem um link?

abraços e obrigado pelo curso.

Monarquista Convicto disse...

escrevi no string %.35f e apareceram os 35 números só porque a partir da 20° casa decimal os número começaram a aparecer diferente.

Jean disse...

Ótima tarde a todos,

realizei uma verificação do tamanho da variável int, aprendido na aula anterior, e constatei que o tamanho retornado pelo sistema é 4 e não dois como descreve um trecho do texto.

"Você sabe que um inteiro ocupa 2 bytes na memória"

Estou confuso e sinceramente não tenho plena certeza se estou falando a coisa correta. Poderia explicar melhor essa parte para nós?

Nélson disse...

Jean Ricardo, eu li em algum lugar que o tamanho que a variável ocupa na memória do PC depende de computador pra computador. Se estiver errado, me corrijam.

Anônimo disse...

Oi qmassa esse tutorial

Unknown disse...

Quero calcular uma % de um valor de uma conta de restaurante , e esse % é 30, é o equivalente a gorjeta do garçom como eu faço isso ?
Consegui emitir para que o usuario escrava o valor , mais como calcular que eu não sei qual variavel usar e como usar :SS
Obrigado galera

Tiago disse...

Jean Ricardo sua dúvida a respeito do espaço ocupado pelo int
link: http://www.cprogressivo.net/2013/01/Modificadores-do-tipo-inteiro-int-em-C--short-long-signed-unsigned.html
abaixo do tópico
O tamanho que cada variável em C pode ocupar em memória

Vimos que uma variável do tipo int (inteira) em C, geralmente ocupa 2 ou 4 bytes na memória de seu computador.
então seu computador está dentro do esperado, talvez seja mais comum os que ocupam 4, só isso.

Chaos disse...

Olá. Estou começando a programar em C. Tentei criar um programa pra calcular a area de um circulo usando variavel do tipo double e quando tentei "chama-la" no programa, usando o código de conversão %f, não funcionou. Uso a IDE DEV C++ ela compilou, não mostrou erro mas quando rodei o executável e joguei um valor pro raio, o problema surgiu.
Eis o código que usei pra fazer a bagaça funcionar (perceba que no lugar do %f usei o %lf, indicação de um colega). Gostaria de entender o porque disso, já que em todos os lugares que li sobre codigos de conversão, dizia que para o tipo float e double usa-se o mesmo código que é %f.

#include
#include

main ()

{
double area, raio, PI = 3.14159;

scanf("%lf",&raio);
//printf("Raio = %f",raio);

area = pow(raio,2)*PI;

printf("A=%.4lf\n",area);

system ("pause");
return 0;
}

Leandro Rodrigues disse...

Boa noite!

Como faço para o programa ler 5 números e calcular a média deles, utilizando apenas 3 variáveis, sem utilizar o comando de repetição.

Hélio Júnior disse...

Interio varia entre dois e 4

Anônimo disse...

Eu vejo nos exemplos em C, que exibem o valor do float assim, %6.2f, assim o 2 exibira 2 casas decimais depois do ponto e o 6 ele só deixa um espaço em branco no console, é isso mesmo? e pq?

técnico em informatica disse...

#include

int main()
{
float salarioSonho =1E6,
salarioReal =10E-3;
printf( "sonhei que meu salario era de R$%.2 , \n mais ele e de R$%.2f centavos ",salarioSonho,salarioReal);





}

Anônimo disse...

E se eu quiser inserir um valor de ponto flutuante.....%fl??? assim?

Anônimo disse...

Alguém sabe fazer rodar um programa para rodar o Pi ? quais são as variáveis, etc.... Por favor.

Anônimo disse...

Se quiser inserir um valor de ponto flutuante coloque %f

DIEGO FIGUEREDO MOREIRA disse...

if (seuPC> GBram4)
printf("Então int = 4bits")
else
printf("Então int=2bits")

}

Unknown disse...

Se eu tenho varios numeros reais e quero deixar todos eles com 4 casas decimais após a virgula, como faço? a cada iteraçao sao gerados muitos numeros! tenho que fazer cout para cada um deles? isso retardaria muito a execucao do codigo.

Lucas disse...

Pq quando eu coloco:

#include

int main()
{
float pi= 3.14;

printf("pi = %f", pi);

}

O resultado do pi fica "3.40000" (?)
É alguma má configuração do CodeBlocks?
Fiz alguma coisa mal no código?

Unknown disse...

Para deixar com 4 casas é só colocar o numero 4 depois do ponto por exemplo: %.4f

Willian Xavier disse...

#include
#include

int main()
{
int parcelas, taxa;
float valor_parcelas, valor_t, valor_emp;
printf("Valor do emprestimo: R$ ");
scanf(" %.2f", &valor_emp);
fflush(stdin);
printf("A taxa de juros sera: ");
scanf(" %d", &taxa);
fflush(stdin);
printf("Numero de parcelas para pagamento: ");
scanf(" %d",&parcelas);
valor_t = (valor_emp + (valor_emp*taxa)/100);
printf("O valor do emprestimo sera: R$ %.2f\n", &valor_t);
valor_parcelas = (valor_t / parcelas);
printf("O Valor das parcelas sera: R$ %.2f\n" ,&valor_parcelas);
}

Boa noite, montei esse exercício para calcular o valor de emprestimo, consigo incluir o valor a taxa de juros e o numero de parcelas, porém o sistema não me retorna o valor do empréstimo e nem o valor das parcelas. Como posso resolver este problema.

Unknown disse...

Boa noite, amigo vc tem que remover o & dos 2 últimos printf, o do valor_t e do valor_parcelas.

👍👍👍

Unknown disse...

Nice