| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
el drogis Lt JG


Registrado: 02 Dic 2003Mensajes: 64Ubicación: Tornavacas (Caceres)
|
Publicado: Mar 23 Mar, 2004 12:01 pm Asunto: FloatToStr, Problema increible |
|
|
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 |
|
 |
el drogis Lt JG


Registrado: 02 Dic 2003Mensajes: 64Ubicación: Tornavacas (Caceres)
|
Publicado: Mar 23 Mar, 2004 12:35 pm Asunto: |
|
|
| 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 |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 23 Mar, 2004 1:33 pm Asunto: |
|
|
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 |
|
 |
el drogis Lt JG


Registrado: 02 Dic 2003Mensajes: 64Ubicación: Tornavacas (Caceres)
|
Publicado: Mar 23 Mar, 2004 5:26 pm Asunto: |
|
|
| el problema no venia de la precision del dato, sino que esa funcion funciona mal para algunos datos, simplemente eso. |
|
| Volver arriba |
|
 |
masBecas Lt

Registrado: 23 Oct 2003Mensajes: 98Ubicación: La Laguna, Tenerife
|
Publicado: Mar 23 Mar, 2004 6:51 pm Asunto: |
|
|
| 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 |
|
 |
rockman Ens

Registrado: 13 Mar 2004Mensajes: 44
|
Publicado: Mar 23 Mar, 2004 9:11 pm Asunto: A mi me pasa lo mismo |
|
|
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 |
|
 |
el drogis Lt JG


Registrado: 02 Dic 2003Mensajes: 64Ubicación: Tornavacas (Caceres)
|
Publicado: Mie 24 Mar, 2004 2:09 am Asunto: |
|
|
| gracias por la aclaracion porque ya me parecia raro lo que hacia. |
|
| Volver arriba |
|
 |
|