Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   problemas con float y redondeos (https://www.clubdelphi.com/foros/showthread.php?t=28532)

wonder boy 22-12-2005 13:08:39

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

OSKR 23-12-2005 15:09:49

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? :confused:

wonder boy 23-12-2005 15:26:26

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

ASAPLTDA 23-12-2005 15:48:50

Float Vs Decimal
 
revisa la configuracion del bde

wonder boy 23-12-2005 15:53:52

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

rastafarey 26-12-2005 14:28:56

Resp
 
Lo unico que te puedo decir es que e ptoblema no es de firebird quisas seas los componentes ueq uses

lpaburto 26-12-2005 16:18:29

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.

wonder boy 26-12-2005 16:32:25

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!!!!

rastafarey 26-12-2005 16:40:20

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

wonder boy 26-12-2005 16:44:45

que componentes usas??, yo uso los dbexpress

jlcasih 26-12-2005 20:01:49

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.

Lepe 26-12-2005 21:29:12

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

jhonny 26-12-2005 22:39:59

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 ;)

rastafarey 27-12-2005 15:23:58

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.

Mick 27-12-2005 16:10:30

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

wonder boy 27-12-2005 16:33:31

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

Lepe 27-12-2005 18:43:15

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

wonder boy 27-12-2005 20:59:06

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


La franja horaria es GMT +2. Ahora son las 14:05:39.

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