1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Formatar casas decimais

Discussão em 'Programação' iniciada por picasso, 27 de Janeiro de 2005. (Respostas: 11; Visualizações: 15806)

  1. picasso

    picasso Power Member

    Boas ppl,

    Estou com um problema (básico) mas não sei como resolver.
    Em C++ como fazer que um valor tenha uma precisão decimal fixa, isto é caso seja introduzido o valor 12.2343354, a variavel apenas fique com o valor 12.23 por exemplo.


    thanks in advance
     
  2. redalert

    redalert Folding Member

    exemplo em C:

    CODE:

    OUTPUT:



    [[]]
     
    Última edição: 27 de Janeiro de 2005
  3. picasso

    picasso Power Member

    Viva,

    Obrigado, mas isso apenas permite formatar o modo de mostrar no ecran. Para isso tb existe o setprecision() para C++.
    O que eu pretendo é que se um utilizador introduzir, por exemplo, 123.456436, apenas guarde numa variavel o valor 123.45

    Não tem a ver com a formatação de saida para o ecran. Eu queria era uma forma simples (sem andar a fazer contas) de definir a precisão decimal a guardar na variavel.


    Muito obrigado.
     
  4. redalert

    redalert Folding Member

  5. picasso

    picasso Power Member

    Viva, mais uma vez muito obrigado pela ajuda, mas a solução não poderá passar pela função printf, pois eu não pretendo mostrar nada no ecran. A função printf (à semelhança de outras setprecision(), precision(), etc...) apenas formatam o aspecto de saida para o ecran de determinado valor. O valor "real" continua atribuido à variavel.
    Resumindo eu preciso é de uma forma, de fixar a precisão decimal de uma variavel.

    Tal como referi anteriormente, caso o user introduza 12134.123445, apenas quero guardar numa variavel 12134.12 (precisão de 2 casas).

    Seria algo do genero:

    cin>>varEntrada;
    varFinal=função(varEntrada); ????!!!!!!

    ou algo assim.....

    Cumprimentos
     
  6. Lancaster

    Lancaster To fold or to FOLD?

    Heyas all..

    Bem andei a ver se descobria alguma coisa sobre isso...e encontrei uma maneira...(na fui eu que inventei o método..foi o meu prof de Programação 2..) estas funções nem eram supostas ser usadas neste tipo de coisas...mas já que existem...à que usá-las...

    Código:
    std::string AsString(double x, char *fmt = "%f");
    
    std::string AsString(double x, char *fmt)
    {
      char s[255];
      sprintf(s, fmt, x);
      return std::string(s);
    }
    
    Isto era uma função que servia para escrever em ficheiros de texto (facilitava em alguns casos escrever em string...)

    O que é que podes fazer:

    Pegas no double que queres por em 2 casas decimais, passas para uma string com a AsString, depois fazes um for onde percorres a string à procura do . (ou da , já na me lembro qual dos 2 é..) depois basta copiares para uma nova string tudo o que está atrás do ponto e mais 2,3,4 caracteres (os que quiseres..)

    E depois usas esta para converter de string para double:

    Código:
    double AsDouble(const std::string& s);
    
    double AsDouble(const std::string& s)
    {
      double  result;
      char *endp;
      errno = 0;
      result = ::strtod(s.c_str(), &endp);
      if (s.empty() || errno || *endp)
      {
        errno = 0;
        std::string message("\"" + s + "\" is not a legal double value.");
        throw message;
      }
      return result;
    
    Eu sei que é uma maneira bastante rebuscada de fazer o que queres...mas não encontrei nada que desse para fazer isso, sem escrever na consola...alguma coisa chaga a cabeça ao pessoal...que o pessoal ajuda...

    Hasta all e espero ter ajudado [[]]

    PS: Estas funções são da autoria do professor Pedro Guerreiro...professor da cadeira de Programação 2 na FCT...
     
  7. Chuls

    Chuls Power Member

    double re;

    re = (num/0.01-(num%0.01))*0.01

    ps: não há arredondamento
    ps2: PG (Pedro Guerreiro) :die:
     
    Última edição: 28 de Janeiro de 2005
  8. Chuls

    Chuls Power Member

    Com arredondamento;

    double func1(double num,int dec){ ?dec > 0?

    double tmp = 1/(10^dec);

    return ((num/tmp + func2(num%tmp))-num%tmp)*tmp;}

    int func2(double num){

    return (num*10+func2(num*10%0.1) >= 5.0) ? 1:0;}

    nota: 10^dec é 10 a potencia de dec. isto não é bem C++ :002:

    ps: PG :puke:
     
  9. xBoShY

    xBoShY Power Member

    Podes usar um raciocinio mais básico...
    - Multiplicas o valor por 100;
    - transformas esse valor para inteiro;
    - divides por 100 e guardas numa variavel float. ;)

    Código:
    float entrada = 123.123456;
    entrada *= 100;
    entrada = (int) entrada;
    entrada /= 100.0;
    
    NOTA: repara no "entrada /= 100.0"... tens que dividir por 100.0, caso dividas só por 100, a divisao de 2 inteiros é 1 inteiro...
     
  10. picasso

    picasso Power Member

    Obrigado a todos,

    Eu tenho a coisa feita de forma matemática (tal como sugeriram), estava era a procurar se existia alguma função nativa de C ou C++ que eu desconheça, para especificar o numero de casas decimais a usar numa determinada variavel? Parece que não, assim apenas nos vale a velha e boa matemática.

    Cumprimentos.
     
  11. redalert

    redalert Folding Member

    é possivel usar funcoes da familia printf para determinadas operacoes de conversao de tipos com formatacao por exemplo float para 'string': sprintf

    a familia do printf nao serve so para apresentar texto no ecra! :)


    [[]]
     
  12. Lancaster

    Lancaster To fold or to FOLD?

    [ON-Topic]

    Realmente tou a ver que eu para programar invento com cada coisa...lol

    [/ON-Topic]

    [OFF-Topic]

    Chuls de onde o conheces? FCT? FCUL? Ou técnico? Eu até curto o homem...aliás..foi ele que me "deu" a paixão por C++...

    [/OFF-Topic]

    Hasta all [[]]
     

Partilhar esta Página