Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

FloatToStr, Problema increible

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: FloatToStr, Problema increible Responder citando

Me quedao de piedra al observar una serie de fallos en esta funcion y no se como arreglarlos. Los fallos son los siguientes:

En una unidad tengo unas TrackBar para recoger unos datos, los cuales debo dividirlos por 100 para que esten entre 0 y 2, y con dos decimales solo. Ahora utilizo la funcion FloatToStr y los pongo en una serie de Labels y los guardo en una estructura. Hasta aqui bien.

Desde otra unidad que incluye a la anterior, saco los datos de la estructura, y al utilizar el FloatToStr sobre ellos, los numeros con mas de un decimal se convierte en un numero parecido con muchos decimales, por ejemplo, el 0.95 se convierte en 0.949999980.

Intente solucionarlo con una variable auxiliar que almacenaba el dato guardado multiplicado por 100 y luego en el FloatToStr cada vez que el valor era 0.3 o 0.6 me pasaba lo mismo que antes.

El caso es que haciendo trazas con F8 vi que el valor que entra en FloatToStr es el correcto pero no se porque no funciona bien.

Si alguien tiene la solucion......
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Este problema no he sido capaz de solucionarlo con la funcion FloatToStr, pero si a alguien le pasa lo mismo le recomiendo la funcion FloatToStrF que no le pasa esto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tu problema es un problema de precisión del dato. La forma más sencilla de presentar el dato con exactamente los decimales que quieras es:
Código:

AnsiString::FloatToStrF(dato, AnsiString::sffFixed, 7, 3);
// Aquí por ejemplo se redondea a 3 decimales

Para más información busca en la ayuda del Builder el tema TFloatFormat
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

el problema no venia de la precision del dato, sino que esa funcion funciona mal para algunos datos, simplemente eso.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Con "precisión" me refiero a que el formato de punto flotante no almacena los valores como uno espera (punto fijo, es decir: 0.95). En lugar de eso almacena un exponente, una mantisa y el signo, y calcula el número resultante haciendo signo*mantisa^exponente. De ahí que no todos los números reales tengan una representación exacta con este formato y q, por ejemplo, 0.95 esté almacenado realmente como 0.9499.
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: A mi me pasa lo mismo Responder citando

Como bien cuentan, es un problema de que el numero se almacena con una mantisa y un exponente.

En este mismo foro, hay un documento que explica la causa de manera más extendida.

En el se recomienda utilizar las variables de tipo double, en lugar de los float, ya que dispone de más bits, y por tanto de mayor precisión.

Ya de digo que no lo he probado... es un tema pendiente en mi actual proyecto.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

gracias por la aclaracion porque ya me parecia raro lo que hacia.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.