![]() |
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 |
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:
|
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 |
Float Vs Decimal
revisa la configuracion del bde
|
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 |
Resp
Lo unico que te puedo decir es que e ptoblema no es de firebird quisas seas los componentes ueq uses
|
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. |
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!!!!
|
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
|
que componentes usas??, yo uso los dbexpress
|
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.
|
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 |
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 ;)
|
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. |
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 |
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 |
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 |
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 21:06:08. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi