Ir ao conteúdo

Posts recomendados

Postado

Olá pessoal, como vai?

 

Estou há um bom tempo quebrando a cabeça em um exercício e agora consegui perceber que o problema não está nos cálculos, mas na leitura do teclado.

Estou tentando ler um número qualquer como float ou double, (mas para meus testes estou inserindo o número 415.15), mas ele está lendo 415.14999999999998000000, isso da um erro nos meus cálculos pois esse número de entrada é utilizado em várias partes do código e acaba dando diferença no final.

 

Eu estava utilizando Float, só que a margem de erro era maior, então passei a utilizar Double, mas ainda há essa margem de erro. Alguém saberia dizer como faço para neutralizar isso? 

 

Obs: Estou utilizando como entrada apenas números com 2 casas decimais, se houver como limitar isso também serve, pois preciso exatamente do número que o usuário digitar. Caso isso seja algo corrente em outras linguagens, quem souber de algum material que eu possa ler também serve.

 

A leitura que estou fazendo para Double é básica:

do{
        scanf("%lf",&Valor);
    }while(Valor<0 || Valor>1000000.00);

 

Obrigado, Vlw!

 

 

Postado
12 minutos atrás, MassakiMsk disse:

Pode postar o código? Testei aqui com um simples scanf seguido de printf e o valor vai certinho.

 

Esqueci de mencionar, é preciso abrir as casas para poder ver esse erro que comentei. Se ajuda em algo, deixei entre os asteriscos a parte onde começa a dar erro nos cálculos, como estou utilizando como referencia as partes inteiras de cada cálculo, onde era para dar 1.0000000 está dando 0.999999999998 (que já começa na parte onde estão os asteriscos). Mas logo após a leitura já tem um printf para verificar.

 

Obrigado, o código está abaixo.

#include<stdio.h>


int main(){

    double Valor;
    int N100,N50,N20,N10,N5,N2,M100,M50,M25,M10,M5,M1;
    double Aux;

    do{
        scanf("%lf",&Valor);
    }while(Valor<0 || Valor>1000000.00);
  
    printf("Valor: %.20f\n",Valor);
    
    //Notas
    N100 = (int)(Valor/100);
    Aux = N100*100;
    N50 = (int)((Valor-Aux)/50);
    Aux+=N50*50;
    N20 = (int)((Valor-Aux)/20);
    Aux+=N20*20;
    N10 = (int)((Valor-Aux)/10);
    Aux+=N10*10;
    N5 = (int)((Valor-Aux)/5);
    Aux+=N5*5;
    N2 = (int)((Valor-Aux)/2);
    Aux+=N2*2;
    M100 = (int)(Valor-Aux);
    Aux+=M100;  
  
    //Moedas
    Valor = (Valor - Aux);    
    M50 = (int)(Valor/0.5);
    Aux = M50*0.5;
    M25 = (int)((Valor-Aux)/0.25);
    Aux+=M25*0.25;
    M10 = (int)((Valor-Aux)/0.1);
    Aux+=M10*0.1;  
    //********************************************************************* 
    M5 =(int)((Valor-Aux)/0.05);    
    Aux+=M5*0.05;
    //*********************************************************************
    printf("M5: %d\n",M5); // Nessa Verificação era para dar 1, mas está dando 0 por ser 0,999999999999800000 
  
    M1 = (int)((Valor-Aux)/0.01);
    Aux+=M1*0.01;


    //system("CLS");
    printf("NOTAS:\n%d nota(s) de R$ 100.00\n%d nota(s) de R$ 50.00\n%d nota(s) de R$ 20.00\n%d nota(s) de R$ 10.00\n%d nota(s) de R$ 5.00\n%d nota(s) de R$ 2.00\n",N100,N50,N20,N10,N5,N2);
    printf("MOEDAS:\n%d moeda(s) de R$ 1.00\n%d moeda(s) de R$ 0.50\n%d moeda(s) de R$ 0.25\n%d moeda(s) de R$ 0.10\n%d moeda(s) de R$ 0.05\n%d moeda(s) de R$ 0.01\n",M100,M50,M25,M10,M5,M1);


return 0;
}

 

Postado
23 minutos atrás, MassakiMsk disse:

Esse é o problema 1021 do Uri né? Eu tenho a minha submissão, mas é bem diferente da sua. Se quiser posso postar aqui para você analizar.

Sim, é o problema 1021, eu resolvi ele utilizando outra lógica, uma sem muito cálculo só trabalhando com laços e contadores, mas dessa forma que eu postei aqui eu submeti lá e deu 10% de erro, e vi que era por causa dessa leitura.

Mas se puder postar o seu aqui também, agradeço. Nunca é demais observar outras formas de raciocínio.

Postado
#include<stdio.h>
int main()
{
    double a;
    int  b, c, d, e, f, n;
    int h, i, j, k, l, m;
    scanf("%lf", &a);
    h=a/100;
    a=a-h*100;
    i=a/50;
    a=a-i*50;
    j=a/20;
    a=a-j*20;
    k=a/10;
    a=a-k*10;
    l=a/5;
    a=a-l*5;
    m=a/2;
    a=a-m*2;
    b=a/1.00;
    a=a-b*1.00;
    c=a/0.50;
    a=a-c*0.50;
    d=a/0.25;
    a=a-d*0.25;
    e=a/0.10;
    a=a-e*0.10;
    f=a/0.05;
    a=a-f*0.05;
    n=round(a/0.01);
    printf("NOTAS:\n");
    printf("%d nota(s) de R$ 100.00\n", h);
    printf("%d nota(s) de R$ 50.00\n", i);
    printf("%d nota(s) de R$ 20.00\n", j);
    printf("%d nota(s) de R$ 10.00\n", k);
    printf("%d nota(s) de R$ 5.00\n", l);
    printf("%d nota(s) de R$ 2.00\n", m);
    printf("MOEDAS:\n");
    printf("%d moeda(s) de R$ 1.00\n", b);
    printf("%d moeda(s) de R$ 0.50\n", c);
    printf("%d moeda(s) de R$ 0.25\n", d);
    printf("%d moeda(s) de R$ 0.10\n", e);
    printf("%d moeda(s) de R$ 0.05\n", f);
    printf("%d moeda(s) de R$ 0.01\n", n);
    return 0;
}

 

adicionado 5 minutos depois

Agora que notei uma coisa estranha. seguind oseu exemplo do 415.15 da errado, mas o uri aceitou. Ele ignora os 5 cents e joga 5 moedas de 1 centavo. Bizarro, mas o Uri aceitou rsrs

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...