Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Redondear en FireBird/Interbase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Redondear en FireBird/Interbase Responder citando

Hola amigazos, Me encuentro desarrollando un sistema en firebird( y lamentablementa a diferencia de otros que he hecho en este sistema) este presenta muchos calculos los cuales los estoy haciendo en procedimientos almacenados.
Ahora como no existe un tipo "currency" me he visto obligado a trabajar con el tipo "double precision" puesto que los tipos "decimal" y "numeric" son practicamente "un alias para el tipo double presicion".
Bueno el problema radica que no puedo redondear a 2 decimales, muchos de los calculos generan una gran cantidad de decimales, no se si alguien ha solucionado este problema
ya sea usando instrucciones de interbase o haciendo uso de UDFs
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

HOLA

Instalate las FUDLibrary, contiene un gran numero de external funtion, como absdbl,absflt,maxdbl,maxflt, que son de gran utilidad para calculos matematicos, no olivides copiar fbudf.dll al directorio de firebird.

By.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

http://www.griffon.demon.co.uk/fudlibrary.html
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Si te sirve de algo yo uso una función en el código para redondeo que vi en este mismo foro:

Código:

double RoundD (double val, int decimales) {
     int i = 1;
     for (int x = 1; x <= decimales; x++)
          i *= 10;
     return floor(val*i + 0.5) / i;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¿ De que forma PUEDO EVITAR EL REDONDEO en interbase cuando declaro un tipo NUMERIC o DECIMAL ? Me gustaria poder truncar los decimales (en otros SGBD existe una operación del tipo TRUNC) para operar correctamente con las facturas y la cotización de éstas. Algo así quiere obtener dado que con CAST lo vuelve a redondear :

Si inserto en un campo de tipo NUMERIC(5,2) me genera lo siguiente :
200.3698 -> 200.37

Pero quiero que me genere : 200.36
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, Decimal no es exactamente un alias de double es de tipo BCD, binario codificado en decimal, lo uso en substitucion del tipo currency y lo implemento asi: Decimal(15,2) y no me da problemas, al principio cuando empece con builder obtuve muchos errores con los decimales pues operaba los valores haciendo conversiones de los DBEdits y Edits asi:
float Resultado =StrToFloat(DBEdit1->Text)/StrToFloat(DBEdit2->Text);
estaba haciendo conversiones innecesarias cuando podia trabajar con los valores de los campos directamente, ademas usaba float en vez de double y me encontraba en algunos casos con un total de factura con una diferencia de un centimo que no conseguia explicarme.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola alfredo, pero con DECIMAL(15,2) ocurre el mismo efecto de redondeo que con NUMERIC, para por ejemplo el valor 200.3698, ¿ alguna idea para evitar el redondeo ? (Estoy con Interbase 6)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Para cecito, ya que realizas los calculos en procedimentos almacenados
prueba con cast aqui un ejemplo
Código:
select 500/3.1416 from rdb$database /*retorna 159,1545*/

select cast(500/3.1416 as decimal(15,2)) from rdb$database /*retorna 159,15*/


Para Ciberale, para truncar no conozco nada especifico a ver si te sirve
este link http://www.volny.cz/iprenosil/interbase/ip_ib_code_string.htm
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Veo que hay que convertir previamente en una ristra de caracteres, con varchar, para poder conseguir evitar el efecto de redondeo y además pienso que de esta manera nos quedamos siempre con las 2 cifras decimales (aunque si es una cifra redonda puede formatearse con Builder). Una factura de 240,39 euros no es lo mismo que 240,40 euros, y que me da igual que me redondee el interbase pero no quiero que lo haga Smile

Asi se obtiene en Oracle :

trunc(125.815, 0) -> 125
trunc(125.815, 1) -> 125.8
trunc(125.815, 2) -> 125.81
trunc(125.815, 3) -> 125.815

Por favor si alguien conoce con el tipo de numeros en simple y doble precisión, alguna manera de conseguir este efecto sin pasar por carácteres, por favor comunicarlo, plz.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.