Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-08-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
ojo con delphi 2006

Estoy trabajando con delphi 2006 y me he encontrado lo siguiente:

Todas la variables del calculo son Double.

Código Delphi [-]
// primer calculo
    saldo := 0;
    for I := 0 to mes do
      begin
        valor := 0;
        valor := t_debe [i] - t_haber [i];
        saldo := saldo + valor;
      end;
    if dm1.OraQr_mcoMCO_CUENTA.Value = 409000000 then
        showmessage(floattostr(saldo));
 
// segundo calculo
    saldo := 0;
    for I := 0 to mes do
        saldo := saldo + t_debe [i] - t_haber [i];
    if dm1.OraQr_mcoMCO_CUENTA.Value = 409000000 then
        showmessage(floattostr(saldo));

El primer showmessage da 0 y el siguiente da 9,09494701772928E-13 .

EL valor correcto es 0.

¿ es un tremendo fallo ?
¿ es mi ignorancia ?
¿ es azar ?
¿ es delphi 2006 ?

Estoy seguro que tiene una explicación per se me ha quedado el cuerpo con mal sabor del delphi 2006.
¿¿¿ Alguien conoce la explicacìón ???????

Última edición por dec fecha: 21-08-2006 a las 12:20:28.
Responder Con Cita
  #2  
Antiguo 21-08-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Por favor, viendo que eres nuevo en el foro, te recomiendo leer la guia de estilo, intentar dar un título más descriptivo a los hilos para las próximas veces y hacer uso de las etiquetas para el código Delphi, SQL, etc

Saludos y bienvenido al foro.
Responder Con Cita
  #3  
Antiguo 21-08-2006
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por avmm2004
El primer showmessage da 0 y el siguiente da 9,09494701772928E-13 .

EL valor correcto es 0.

¿ es un tremendo fallo ?
¿ es mi ignorancia ?
¿ es azar ?
¿ es delphi 2006 ?
Bueno, el error no es tan grande, ya que en lenguaje humano el resultado es 0'000000000000909494791772928, vamos que es casi 0. No he hecho la prueba, pero tal vez el error se deba, precisamente, a que se está usando Double. Este tipo utiliza un sistema de codificación denominado "punto flotante" que permite almacenar un ámplio rango de números (desde tremendamente grandes hasta tremendamente pequeños) y facilita los cálculos pero a costa de perder precisión y exactitud en algunos casos.

Otro sistema de codificación, denominado "punto fijo", podría dar el resultado correcto, pero no permitiría almacenar ciertos números; por ejemplo, le resultaría imposible almacenar el número 0'1.

Un tercer método denominado "binario codificado en decimal" permite mucha más precisión (hasta llegar a la exactitud), pero para almacenar números grandes necesita mucha más memoria que los dos anteriores.

Si esto es cierto, el problema no es del lenguaje ni del compilador sino del microprocesador.

Última edición por Ñuño Martínez fecha: 21-08-2006 a las 11:54:27.
Responder Con Cita
  #4  
Antiguo 21-08-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
Problemas con el punto flotante

Gracias, por la respuesta tan rápida.
Olvidé mencionar un tema.
Todos los valores que tienen las tablas y que se cargan previamente (no incluí el código para no poner un montón de líneas) son 0 o valores con dos decimales como máximo (positivos y negativos).
Y las cantidades ninguna sobrepasa en la parte entera el valor 99999.
Por cierto la tabla solo tiene 13 elementos, con lo cual con ¿ningun calculo ? me puede dar un valor tan alto.
Responder Con Cita
  #5  
Antiguo 21-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Si estas trabajando con datos monetarios usa el tipo de dato Currency, tanto en la base de datos como en delphi, así solo cogerá los 2 primeros decimales.

Si usas Firebird como base de datos, debes crear el campo como NUMERIC(10,2) y dialecto 3.

Como ya te han dicho, es un problema inherente al tipo de datos Float. Además tambien influye el Epsilon de la máquina, que es el número más pequeño que puede se puede definir con total precisión en ese ordenador.

Por cierto: Diez Billonésimas parte de 1 euro/peso/peseta/dolar es ¿un valor tan alto?

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 21-08-2006 a las 17:10:55.
Responder Con Cita
  #6  
Antiguo 21-08-2006
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Te estas confundiendo, no te esta dando ningun valor alto, simplemente un valor pequeñisimo muy proximo a cero.
Este numero esta en notacion cientifica:
9,09494701772928E-13
Que se correponde a (como ya han explicado en otro post)
0'000000000000909494791772928
Es decir un numero muy pequeño proximo a cero.

Es posible incluso que alguno de los valores que tienes guardados en la base de datos no sean exactamente cero, pero la herramienta o el software con el que los ves lo redondeara a un numero determinado de cifras decimales de modo que te parecera que valen 0 aunque no sea asi.

Esto te pasara en cualquier ordenador y cualquier compilador, al trabajar con numeros en punto flotante.

Saludos
Responder Con Cita
  #7  
Antiguo 21-08-2006
avmm2004 avmm2004 is offline
Miembro
 
Registrado: jun 2006
Ubicación: Santa cruz de Tenerife, Islas Canarias
Posts: 500
Poder: 18
avmm2004 Va por buen camino
A lo que yo voy es a lo siguiente:

Si se fijan hay dos formulas de cálculo en el código.
Ambas hacen exactamente lo mismo y los resultados son diferentes.

Eso es lo que mas me preocupa.
Entiendo y agradezco todos los comentarios anteriores pero no entiendo que ambas formulas den un resultado diferente (cuando hacen lo mismo).

Si ambas formulas dieran igual, puedo entender casi todo, pero no puedo entender que segun haga el calculo (bien por supuesto) me de un resultado o otro, con el mismo set de datos.

Por cierto, no utilizo Firebird utilizo Oracle 9i y la definición del campo, por casualidad es numeric (10,2).

Gracias.
Responder Con Cita
  #8  
Antiguo 21-08-2006
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.559
Poder: 25
egostar Va camino a la fama
Post

El tema como dicen atinadamente todos es por el valor de punto flotante, pero porque no haces esto:

Código Delphi [-]
 
// segundo calculo
saldo := 0; for I := 0 to mes do
        saldo := saldo + (t_debe [i] - t_haber [i]); { Propiedad asociativa }
    if dm1.OraQr_mcoMCO_CUENTA.Value = 409000000 then
        showmessage(floattostr(saldo));

Bueno, todo se vale con tal de salir de nuestras dudas.

Saludos
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
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
Consulta Delphi 6, Delphi 2005 y Delphi 2006 Leviatan Varios 6 18-08-2007 16:02:08
Delphi 2006? lookmydoom Varios 4 15-08-2006 13:54:45
Que es .net y delphi 2006 artemisa Varios 2 07-04-2006 00:59:51
Pasar de delphi 7 a Delphi 2006 (problemas con VCL) jmlifi .NET 8 24-01-2006 15:51:30
Delphi 2006 FGarcia Noticias 3 28-12-2005 18:07:44


La franja horaria es GMT +2. Ahora son las 19:39:16.


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