none
Problema em conversão float RRS feed

  • Pergunta

  • E ai pessoal

    Tenho um vetor de string com números específicos

    vet[0] = "0.9373655" 
    
    Tenho que convertê-los para float
    
    minhaVariavel = float.Parse(vet[0].Replace(".", ","));
    

    Só que o resultado fica 0.937365472, ja tentei com double e também não mantem o valor que eu preciso, alguém ja teve esse problema também?

     

    sexta-feira, 27 de maio de 2011 19:53

Respostas

  • Desse jeito que eu tinha colocado

    decimal.Parse(float.Parse(valor[0].Replace(".", ",")).ToString());
    

    Ele mantinha o valor que eu precisava, mas na hora de converter um valor do tipo 12E5 ele dava problema de novo

     

    O jeito certo que eu consegui foi assim:

    float valAux = 0.0f;
    decimal val = 0;
    
    valAux = float.Parse(valor[0].Replace(".", ","));
    val = (decimal)valAux;
    
    Obrigado pela ajuda de todos

     

    terça-feira, 31 de maio de 2011 13:43

Todas as Respostas

  • Aqui está normal,o resultado é 0,9373655.Tanto com float tanto com decimal,como o Rafael falou...
    sexta-feira, 27 de maio de 2011 19:57
  • Paulo.

    Utilize o tipo decimal para fazer esse tipo de conversão:

    vet[0] = "0.9373655" 
    decimal minhaVariavel = decimal.Parse(vet[0].Replace(".", ","));
    
    

    sexta-feira, 27 de maio de 2011 19:57
  • Ja tentei usar o decimal, mas tem caso que preciso de um valor alto, tipo 12E5, ai o decimal da erro
    sexta-feira, 27 de maio de 2011 20:01
  • Ja tentei usar o decimal, mas tem caso que preciso de um valor alto, tipo 12E5, ai o decimal da erro

    Impossivel.

    Decimals tem precisão de 28 a 29 digitos cara. 

    Eu entendo que o que vc está passando é pura e simplesmente facil de se resolver com Math.Round, onde vc passa o numero de casas decimais que vc quer, neste exemplo são 7, e pronto

    decimal returnValue = Math.Round(decimal.Parse(vet[0].Replace('.',',')), 7);
    

    A unica contraparte é que calculos decimais são bem + lentos que calculos usando float e double. 

    []s

    segunda-feira, 30 de maio de 2011 01:35
  • Eduardo, na verdade o problema do decimal não é pelo tamanho e sim que ele não consegue converter uma expressão com letra também, como no caso o 12E5
    segunda-feira, 30 de maio de 2011 17:46
  • Ah ta, nesse caso realmente!

    Da pra vc aplicar a seguinte logica, neste caso:

     

     

    Math.Round(float.Parse(vet[0].Replace('.',',')),7)
    

     

     

    o resultado será um double, mas vc da parse num float, possibilitando letras!

     

    isso te ajuda em algo?


    segunda-feira, 30 de maio de 2011 17:50
  • Da o mesmo problema Eduardo, o estranho é que eu criei um projeto de teste, lendo o mesmo arquivo, fazendo a mesma conversão e no teste ele da o resultado certo, ja no projeto que preciso ele da essa diferença. Vai entender
    segunda-feira, 30 de maio de 2011 18:16
  • Cara, esgotaram-se minhas alternativas.

    Teoricamente ele tinha de aceitar, até seria possivel vc dar cast de (float) na frente do Math.Round pra ele retornar um float e não um double.

    O maior problema mesmo esta sendo o arredondamento, pra mim o Round é a unica saida plausivel. String.Format não entra nesse caso.

    segunda-feira, 30 de maio de 2011 18:39
  • O único jeito que consegui foi fazendo assim:

    decimal.Parse(float.Parse(valor[0].Replace(".", ",")).ToString());
    
    • Sugerido como Resposta Eduardo Cury segunda-feira, 30 de maio de 2011 19:26
    segunda-feira, 30 de maio de 2011 18:40
  • Ué, se vc conseguiu é isso que importa. Eu ia dar essa sugestão mas preferi não envolver o float.Parse com medo de ele danar o resultado como fez sendo aplicado sozinho. Se vc conseguiu com decimal, da cast pra float e armazena num float...pronto!

    segunda-feira, 30 de maio de 2011 18:44
  • Desse jeito que eu tinha colocado

    decimal.Parse(float.Parse(valor[0].Replace(".", ",")).ToString());
    

    Ele mantinha o valor que eu precisava, mas na hora de converter um valor do tipo 12E5 ele dava problema de novo

     

    O jeito certo que eu consegui foi assim:

    float valAux = 0.0f;
    decimal val = 0;
    
    valAux = float.Parse(valor[0].Replace(".", ","));
    val = (decimal)valAux;
    
    Obrigado pela ajuda de todos

     

    terça-feira, 31 de maio de 2011 13:43