Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
problemas con float y redondeos

hola amigos

espero puedan sacarme de esta!!!

antes de empezar, uso FB1.5 y D7

tengo una tabla por donde pasan todos los importes de una empresa, hasta ahora venia todo muy bien, tenia un campo IMPORTE de tipo FLOAT, pero debido a una diferencia de un centavo, me di cuenta que los importes que me devuelve y que guarda Firebird son erroneos, por ejemplo, si yo a este campo le pongo el valor 151171.90, firebird me agrega 0.006, o seaque me queda 151171.906 y si hago un SQL de esto me lo toma como 151171.91, y es ahi donde tengo el problema, si los importes no son tan grandes no tengo problemas. espero haber sido claro en mi explicacion...


desde ya muchas gracias
Responder Con Cita
  #2  
Antiguo 23-12-2005
Avatar de OSKR
OSKR OSKR is offline
Miembro
 
Registrado: nov 2004
Ubicación: San Cristóbal/Táchira/Venezuela
Posts: 389
Poder: 20
OSKR Va por buen camino
No he usado FireBird (en eso estoy), pero pudiera ser problema del IDE de la Borland q usas, yo he tenido esos mismos problemas con Builder (con los decimales especificamente) e incluso en la inicialización los decimales son distintos a los q le asigné y por otros medio de redondeo he solventado, lo mismo he probado con otros lenguajes en los cuales no ha habido este problema........¿Quién sabe porq?
__________________
Los Estados Unidos parecen destinados por la Providencia para plagar la América de miserias a nombre de la libertad."
Simón Bolívar
(Carta al Coronel Inglés Patricio Cambell 05/08/1829).
Responder Con Cita
  #3  
Antiguo 23-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
es cierto, ademas no se si te has dado cuenta qe en algun calculo entre un double y un variant, debes pasarlo a string con formatfloat, porque sino te dice que son distintos numeros, a pesar que los dos son igual a 0.00 (eso es a simple vista en realidad muchas veces son igual a 0.00000343213232)

bueno, si alguien quiere decir algo mas estare agradecido, al menos para que me acompañene en mi penar, jajajajajaja

saludos
Responder Con Cita
  #4  
Antiguo 23-12-2005
ASAPLTDA ASAPLTDA is offline
Miembro
 
Registrado: jun 2003
Ubicación: COLOMBIA-CALI
Posts: 639
Poder: 21
ASAPLTDA Va por buen camino
Float Vs Decimal

revisa la configuracion del bde
Responder Con Cita
  #5  
Antiguo 23-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
la verdad que no se que tocar!!!, pero por las dudas aclaro que uso DBEXPRESS, si me dicen que tocar en la configuracion del BDE (que no se si servira para lo que yo uso) diganme y hare la prueba

estoy abierto a escuchar mas opiniones

muchas gracias
Responder Con Cita
  #6  
Antiguo 26-12-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Lo unico que te puedo decir es que e ptoblema no es de firebird quisas seas los componentes ueq uses
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #7  
Antiguo 26-12-2005
lpaburto lpaburto is offline
Miembro
 
Registrado: sep 2005
Posts: 10
Poder: 0
lpaburto Va por buen camino
Con respecto a este tema, yo tambien tengo este problema cuando utilizo decimales.

Ejemplo, en un programa de cotizaciones genero una serie de porcentajes de costo para efectuar el calculo y termino en un factor porcentual de 1.35 (35 % mas), pero en la base de datos almacena 1.3499993458 (ingresado directamente atravez de varios programas administradores de FIREBIRD) y si multiplicas uno u otro por 15.000.000 las diferencias son preocupantes.

Esto lo solucione con rutinas de redondeo pero aun se me producen diferencias pero mas razonables.

Delphi no puede ser, puesto que he ingresado atraves del ID Expert y del EMS Firebird/Interbase.
Responder Con Cita
  #8  
Antiguo 26-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
no se el ID expert (que supongo sera el IB expert), pero el EMS esta hecho en Delphi, habria que probar con alguna consola que no pase por Delphi, aunque creo que el problema, es que no deberia ser float el dato a usar, sino Decimal, yo probe con ese tipo de datos y me dio bien, por ahora los problemas los tengo con valores mayores a 100000, no quiero saber que pasaria si me voy al millon!!!!
Responder Con Cita
  #9  
Antiguo 26-12-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

Les puedo asegurar que es erro de componetes y no de fefirebird. Como tabien les puedo asgurar que en la base de datos eldato esta perfecto y que el problema es solo de visualizacion. Y si quieren compruebenlo para que se den cuenta
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #10  
Antiguo 26-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
que componentes usas??, yo uso los dbexpress
Responder Con Cita
  #11  
Antiguo 26-12-2005
jlcasih jlcasih is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina
Posts: 54
Poder: 21
jlcasih Va por buen camino
Hola, mira creo te convendria definir el tipo de datos como un numeric(x,x) en vez de float para los montos para que puedas operar con mayor presicion. Yo he tenido muchos problemas con esto, lo que puedes hacer ya que no puedes cambiar lo hecho es redondear los valores cuando los obtienes, y en los store procedure castiarlos si operas en los mismos, acordate que tenes que tener en cuenta que sean del mismo tipo de dato. Espero te sirva. Saludos.
__________________
Cordoba-Argentina
Responder Con Cita
  #12  
Antiguo 26-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Exacto jlcasih De hecho en las guías de Firebird/Interbase no se recomienda el uso de FLOATS para aplicaciones contables ni similares.

El hecho es que dos floats, aunque sean iguales, puede tener distinta cantidad de números despues de la coma decimal, de ahí que "aparezcan" decimales de sobra, aún cuando se intente decirle que solo tenga 2 decimales.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #13  
Antiguo 26-12-2005
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Aca muestro un articulo con las conclusiones que marteens saca al respecto del campo numeric http://www.marteens.com/trick25.htm, espero sirvan de algo y que a ustedes les ayude a sacar sus propias coclusiones
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #14  
Antiguo 27-12-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
resp

No se pero hasta donde se estos valores simpre tendran una precision del maximo soportdo por la base de datos.

Ha y los componenetes que uso son los ibobjects.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #15  
Antiguo 27-12-2005
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 22
Mick Va por buen camino
Este tema es bastante recurrente en los foros, el problema no tiene que ver ni con firebird ni con los componentes, es una cuestion de como los computadores guardan la informacion con numeros en punto flotante: los ordenadores trabajan en formato binario (base 2) y numeros que tienen una representacion exacta en una determinada base (como por ejemplo base 10) no se pueden representar de forma exacta en otras (como base 2 que es como se guardan internamente los valores).

Aconsejo leer esta documentacion:

An Overview of Floating Point Numbers.

http://community.borland.com/article...,15855,00.html

En concreto la parte titulada:

"Round-Off Problems"

Saludos
Miguel
Responder Con Cita
  #16  
Antiguo 27-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
finalmente y para sacar una conclusion definitiva, habria que usar el tipo de datos decimal(n,m)??

gracias
por toda la info dedicada a este hilo
Responder Con Cita
  #17  
Antiguo 27-12-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
No.

Me iba a quedar en esa palabra para que revisaras de nuevo la info dada... pero como no estamos en clase, y lo que se busca en un foro son respuestas, pues...

Decimal(10,m)
Numeric(10,m)

Da igual lo que eligas en escala, solo es para el número de decimales que quieras, 2, 3 o 6.

saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #18  
Antiguo 27-12-2005
Avatar de wonder boy
wonder boy wonder boy is offline
Miembro
 
Registrado: mar 2004
Ubicación: Argentina
Posts: 50
Poder: 21
wonder boy Va por buen camino
muchisimas gracias Lepe por tu respuesta, es la respuesta mas logica (cuando decis que deberia haber leido la info dada) y mas coherente (porque vas directo al grano)

muchas gracias de nuevo
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


La franja horaria es GMT +2. Ahora son las 07:59:51.


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