Ir para conteúdo

Printf no C não está mostrando as decimais do float


capgaivo

Posts Recomendados

Perdão se for dúvida boa, mas sou iniciante, idoso no segundo mês de estudos de programação e bancos de dados.

tenho um código em C aparentemente muito simples, que deveria mostrar o resultado final em float com duas casas decimais, PORÉM, mostra apenas dois ZERO, por exemplo, deveria apresentar 12,50 e apresenta 12,00

Segue o código e o retorno no console:]

#include <stdio.h>
#include <cs50.h>

int main(){
    int qmin, qmax;
    float emed;

    printf("Informe quantidade minima: ");
    scanf("%d", &qmin);

    printf("Informa quantidade maxima: ");
    scanf("%d", &qmax);

    emed = (qmin + qmax)/2;
    printf("%.2f\n", emed);
    printf("O estoque medio é %.2f\n", emed);

}

 

RETORNO:

~/ $ ./secao02-exercicio03
Informe quantidade minima: 10
Informe quantidade maxima: 15
O estoque medio é 12.00

Alguém poderia me ajudar?

grato

  • Agradecer 1
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Oi @capgaivo!

Se liga na linha onde você faz a conta:

emed = (qmin + qmax) / 2;

Nessa linha, o que está à direita do igual é avaliado primeiro. Neste caso, dois tipos int são somados (qmin e qmax). O resultado, que também é um int, é  dividido por um outro int de valor 2. Ou seja, você tem um valor int sendo dividido por outro valor int. O resultado é, naturalmente, um valor do tipo int também.

Aí como emed é float, o int resultante é promovido para float. No caso, 25 / 2 = 12 (tudo int) e 12 promovido para float é 12.0.

Acredito que a forma mais rápida de resolver isso seja dividindo por 2.0f ou (float)2, ao invés de 2. Então você terá uma conta à direita do igual que dividirá um int por um float e o resultado de int / float é float. 😉

Resumindo, em geral:

  • int / int = int
  • float / int = float
  • int / float = float

PS.: Você pode se sentir uma inclinação de dividir por 2.0, mas sem o sufixo f, o 2.0 é um literal do tipo double. Então você teria um resultado do tipo double que depois seria convertido pra float. Eu não lembro das implicações disto. Talvez outra pessoa possa ajudar mais, mas eu recomendaria fazer float com float mesmo. 🙂

Abraço.

 

  • Agradecer 1
Link para o comentário
Compartilhar em outros sites

  • 11 meses depois...
Em 25/06/2024 em 12:19, Devair disse:

 

misturar int e float o resultado é int  e sem casas decimais , então pode sim , também , misturar os tipos mas junto um "cast"   "(float)"  , para float e seu código mostraria o resultado com quantas casas decimais você queira , e seu código poderia ser assim :

#include <stdio.h>
#include <cs50.h>
#include <locale.h>
int main(){
    setlocale(LC_ALL,"");
    int qmin, qmax;
    float emed;

    printf("Informe quantidade minima: ");
    scanf("%d", &qmin);

    printf("Informa quantidade maxima: ");
    scanf("%d", &qmax);

    emed = (float)(qmin + qmax)/2;
    printf("%.2f\n", emed);
    printf("O estoque medio é %.2f\n", emed);

}

 

Link para o comentário
Compartilhar em outros sites

Em 06/07/2023 em 16:11, Fernando Mercês disse:

PS.: Você pode se sentir uma inclinação de dividir por 2.0, mas sem o sufixo f, o 2.0 é um literal do tipo double. Então você teria um resultado do tipo double que depois seria convertido pra float. Eu não lembro das implicações disto. Talvez outra pessoa possa ajudar mais, mas eu recomendaria fazer float com float mesmo.

No caso a implicação não é importate, dado que printf() sempre converte argumentos float para double. O formato %f é double, para o printf() -- que é uma função "intrínseca". Isso é diferente no scanf(), onde %f é float, %lf é double e %Lf, long double.

Ali, também, a divisão por 2.0 resultará em double, mas o arredondamento terá que ser feito na conversão para float, o que será a mesma coisa que dividir por 2.0f (visto que a divisão por 2 apenas mudará o fator de escala). E, uma vez que o printf() está restringindo a "precisão" para 2 "casas decimais", tanto faz ser float ou double. A perda de 29 bits de precisão do double para o float, aqui, não faz diferença.

EU faria a conta de maneira diferente:

emed = ((double)qmin + qmax)/2;

Por quê double? Porque a precisão de um int é de 31 bits e double tem precisão de 53 bits. Essa expressão evitaria um possível overflow na soma e, como o resultado dela é double, o literal 2 também é convertido para double, deixando a conversão final para float.

[]s
Fred

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...