Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-03-2010
ioco ioco is offline
Miembro
 
Registrado: ene 2010
Posts: 42
Poder: 0
ioco Va por buen camino
edit.text muestra un valor erróneo :S

Buenas! Tengo ya casi terminado un programa de contabilidad casera y me encuentro con que a la hora de consultar las entradas guardadas a veces me devuelve valores incorrectos :S

Les planteo lo que tengo porque yo ya no sé qué hacer...

Tengo un file con datos del tipo:

Código Delphi [-]
TDato = record
           Concepto:string[25];
           Cantidad:real;
           Dia:integer;
    end;

Estos datos los guardo desde un formulario de entrada de datos, que funciona correctamente.

Entonces, desde otro formulario de consulta de datos, muestro los gastos para el periodo seleccionado agrupados por tipo de gasto.

Para esto tengo una label con el nombre del concepto y un edit para resaltar el valor de la salida. Entonces, al presionar un botón se rellenan los edits con los datos.

Los edits los cargo todos con el valor "0" para empezar y luego voy añadiendo las cantidades adecuadas a cada concepto con:

Código Delphi [-]
{Consultamos cada dato del fichero}
                                 For i:=1 to LongFichero(MesSeleccionado) do
                                     Begin
                                          ConsultarDato(i,MesSeleccionado);
                                          {Si el dato está dentro del rango de días especificado, suma su cantidad
                                          a la existente en el campo correspondiente de salida}
                                          If (Dato.Dia>=min) and (Dato.Dia<=max) then
                                             If Dato.Concepto='Agua' then
                                                Edit5.Text:=FloatToStr(StrToFloat(Edit5.text)+Dato.Cantidad)
                                             else If Dato.Concepto='Aseo' then
                                             //...Sigue para cada concepto (20 en total)

Bueno, creo que con esto se pueden hacer una idea del programa. Si falta algo lo subiré cuanto antes.

Y ahí viene mi problema... Si Dato.Cantidad es un número cualquiera (10, 15, 100, -30 (acepta numero negativos para correcciones), 50.4, etc.) no me da ningún problema. Pero para números concretos me devuelve valores erroneos (por ejemplo, he detectado que si el dato es 15.7 me devuelve 15.69999999999 y que si tenemos dos datos del mismo concepto que sean 15.7 y -15.7 (que se trataría de una corrección y cuyo resultado debería de ser 0) me devuelve -9.xxxxxx (no recuerdo bien los decimales, pero no era periódico)).

No sé si es tema del edit o qué pasa ya que he comprobado copiando todas las entradas del file a un textfile y consultandolas con bloc de notas los valores guardados son los que deberían (15.7 sale 15.7 y no 15.69999999).
Así que con esto creo que se confirma que el dato está bien guardado y el reduce el posible fallo a la lectura del dato mediante

Código Delphi [-]
Edit5.Text:=FloatToStr(StrToFloat(Edit5.text)+Dato.Cantidad)

pero no entiendo dónde puede fallar ni porqué falla para unos números y para otros no :S

Espero haber sido suficientemente claro y espero me disculpen por la barbaridad de post.

Muchísimas gracias de antemano ya por leer mi duda
Responder Con Cita
  #2  
Antiguo 03-03-2010
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
La representación binaria de un número real no es exacta, razón por la cual una computadora maneja internamente un número como una aproximación. 15.69999999999 es muy parecido a 15.7; tanto, que para cualquier efecto práctico es una diferencia despreciable.

Podrías usar una función como FormatFloat para presentar el número en el Edit, por ejemplo, redondeado a dos decimales te mostrará 15.7.

Por otra parte, también podrías usar un tipo de datos como Currency, que es un tipo de punto (coma) fijo que minimiza este tipo de "problemas".

// Saludos
Responder Con Cita
  #3  
Antiguo 03-03-2010
ioco ioco is offline
Miembro
 
Registrado: ene 2010
Posts: 42
Poder: 0
ioco Va por buen camino
Gracias por la respuesta, en un rato podré probar ambas cosas y les comento ^^
Responder Con Cita
  #4  
Antiguo 03-03-2010
ioco ioco is offline
Miembro
 
Registrado: ene 2010
Posts: 42
Poder: 0
ioco Va por buen camino
Genial

Cambié la asignación por

Código Delphi [-]
Edit5.Text:=FloatToStrF(StrToFloat(Edit5.text)+Dato.Cantidad,ffFixed,8,2)

y funciona a la perfección ^^

Gracias de nuevo

PD: Me estoy haciendo una chuleta con los diferentes tipos de datos que hay y su uso con algunas notas ya que en clase no pasamos ni pasaremos del integer y el real para los números. Gracias por el consejo jeje
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
limpiar text en edit botones67 Varios 5 11-08-2012 20:10:22
como saber el valor que muestra un edit gaston260 API de Windows 13 14-02-2009 01:46:40
volver un TEdit.Text un valor? Ðαяισš Varios 2 02-01-2009 05:06:17
Help: Funcion Cos() me arroja un valor erroneo rubencho C++ Builder 3 22-07-2008 04:40:52
Guardar Edit.Text en un Txt Greco Varios 3 14-11-2007 23:47:19


La franja horaria es GMT +2. Ahora son las 11:22:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi