Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Manipulação precisa de número em ponto flutuante

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C# Manipulação precisa de número em ponto flutuante

    Oi galera, perdoem se a dúvida parecer trivial demais, mas faz pouco tempo que comecei a brincar com C.
    A questão é que preciso usar um %f para pedir um valor, mas o problema é que esse valor em ponto flutuante não fica "exatamente como digite", eu preciso que ele seja exatamente aquilo que foi digitado para fazer os cálculos. Não estou falando de "imprimí-lo exatamente como foi recebido", pois isso seria bem simples, apenas usar um %.2f, por exemplo resolveria, estou falando de "manipulá-lo" assim como recebi. Para exemplificar melhor, no trecho a seguir eu peço um número float e imprimo-o logo em seguida, note que o valor impresso não é o mesmo, como faço para que o valor seja realmente o digitado? Preciso dessa precisão para os cálculos em um algorítimo que faz contas (isoladas) também com o último, com os "centavos".

    main(){
    float num;
    //tente digitar numeros como 126.56
    printf("\nEntre com o valor em reais: \n");
    scanf("%f",&num);
    printf("\nNum= %f Valor %f\n",num);
    }

    Esse código imprime: 126.559998.
    Para imprimí-lo precisamente é fácil, mas o que preciso é "manipulá-lo" como se ele fosse realmente 126,55 para cálculos onde até a segunda casa depois da vírgula é relevante.
    Não achei resposta na net. Agradeço desde já qualquer ajuda.
    "A alma não tem segredo que o comportamento não revele." (Lao-Tsé)
    Similar Threads

  • Font Size
    #2
    Bom, não consegui descobrir como impedir que isso aconteça mas já consegui contornar o erro, aritmeticamente, foi uma saída, só não sei se elegante.
    De toda forma, grato ao fórum. rsrs
    "A alma não tem segredo que o comportamento não revele." (Lao-Tsé)

    Comment


    • Font Size
      #3
      Tenta usar double no lugar de float

      main(){
      double num;
      printf("Escreva o valor");
      scanf("%lf",&num);
      printf("\nO valor eh %f",num);
      system("PAUSE");
      }

      Comment


      • Font Size
        #4
        Postado Originalmente por Mero_ Ver Post
        Bom, não consegui descobrir como impedir que isso aconteça mas já consegui contornar o erro, aritmeticamente, foi uma saída, só não sei se elegante.
        De toda forma, grato ao fórum. rsrs
        Como contorno o erro ?


        Notify-list ~ Twitter ~ E-mail

        Comment


        • Font Size
          #5
          Postado Originalmente por ofwgkta Ver Post
          Tenta usar double no lugar de float

          main(){
          double num;
          printf("Escreva o valor");
          scanf("%lf",&num);
          printf("\nO valor eh %f",num);
          system("PAUSE");
          }
          Poxa, era exatamente isso que tava procurando Ofwgkta, perfeito, obrigadão.

          Postado Originalmente por fopen Ver Post
          Como contorno o erro ?
          Fopen, como ainda não tinha considerado a dica do Ofwgkta, eu usei um macete (gambiarra) aritmética, no código a seguir eu quero receber uma quantia em reais (dinheiro) e saber com quantas cédulas e moedas (sempre primeiro as de maior valor possível) eu represento a quantia. Como usando o valor em float o número era "alterado" de forma 'aleatória', às vezes para mais e às vevez para menos, tipo:
          126.56 virava 126.5599988
          128.8 virava 128.800003
          Então eu sempre tinha uma diferença de um centavo no final das contas, por isso eu só verifiquei que valor tinha a partir da terceira casa decimal, e incrementava a variável de um centavo, pois quando o "número é alterado para mais" eu tenho um valor alto nessa casa, quando é "alterado para menos" eu tenho um zero, e um valor pequeno lá pra sexta casa, fiz:
          if(troco>0.008) ++moeda1;

          Código completo:

          #include <stdio.h>
          #include <stdlib.h>
          #include <conio.h>

          main(){
          float num, valor, troco;
          int ced100, ced50, ced20, ced10, ced5, ced2, moeda50, moeda25, moeda10, moeda5, moeda1, moeda1real;

          printf("\nEntre com o valor em reais: \n");
          scanf("%f",&num);

          valor=num;
          num=(int)num;
          troco=valor-num;

          ced100=num/100;
          ced50=(num-(ced100*100))/50;
          ced20=(num-(ced100*100)-(ced50*50))/20;
          ced10=(num-(ced100*100)-(ced50*50)-(ced20*20))/10;
          ced5=(num-(ced100*100)-(ced50*50)-(ced20*20)-(ced10*10))/5;
          ced2=(num-(ced100*100)-(ced50*50)-(ced20*20)-(ced10*10)-(ced5*5))/2;
          moeda1real=(num-(ced100*100)-(ced50*50)-(ced20*20)-(ced10*10)-(ced5*5)-(ced2*2));

          if(troco)
          {
          moeda50=troco/0.5;
          moeda25=(troco-(moeda50*0.5))/0.25;
          moeda10=(troco-(moeda50*0.5)-(moeda25*0.25))/0.10;
          moeda5=(troco-(moeda50*0.5)-(moeda25*0.25)-(moeda10*0.1))/0.05;
          moeda1=(troco-(moeda50*0.5)-(moeda25*0.25)-(moeda10*0.1)-(moeda5*0.05));
          troco=(troco-(moeda50*0.5)-(moeda25*0.25)-(moeda10*0.1)-(moeda5*0.05)-(moeda1));
          if(troco>0.008) ++moeda1;
          }

          printf("\nCedulas de 100=%d \nCedulas de 50=%d \nCedulas de 20=%d \nCedulas de 10=%d \nCedulas de 5=%d \nCedulas de 2=%d\n", ced100, ced50, ced20, ced10, ced5, ced2);
          printf("\nMoedas de 1 real=%d\nMoedas de 50=%d\nMoedas de 25=%d\nMoedas de 10=%d\nMoedas de 5=%d\nMoedas de 1=%d\n", moeda1real, moeda50, moeda25, moeda10, moeda5, moeda1);

          system("pause");

          }
          "A alma não tem segredo que o comportamento não revele." (Lao-Tsé)

          Comment

          X
          Working...
          X