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.

8 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 Ricardo 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

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?

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.