| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Vie 16 Jul, 2004 8:29 pm Asunto: Redondear en FireBird/Interbase |
|
|
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 |
|
 |
TOÑO Master

Registrado: 26 Ago 2002Mensajes: 223Ubicación: Madrid - España -
|
Publicado: Lun 19 Jul, 2004 1:21 pm Asunto: |
|
|
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 |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
|
| Volver arriba |
|
 |
Kurroman Lt

Registrado: 07 Dic 2003Mensajes: 79
|
Publicado: Mar 20 Jul, 2004 11:20 am Asunto: |
|
|
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 |
|
 |
ciberale Cdt

Registrado: 17 Oct 2003Mensajes: 18
|
Publicado: Mar 30 Ago, 2005 7:53 pm Asunto: |
|
|
¿ 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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mar 30 Ago, 2005 9:35 pm Asunto: |
|
|
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 |
|
 |
ciberale Cdt

Registrado: 17 Oct 2003Mensajes: 18
|
Publicado: Mar 30 Ago, 2005 10:09 pm Asunto: |
|
|
| 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 |
|
 |
alfredo Master

Registrado: 13 Oct 2003Mensajes: 246Ubicación: Valencia Venezuela
|
Publicado: Mie 31 Ago, 2005 5:50 pm Asunto: |
|
|
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 |
|
 |
ciberale Cdt

Registrado: 17 Oct 2003Mensajes: 18
|
Publicado: Mie 31 Ago, 2005 10:51 pm Asunto: |
|
|
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
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 |
|
 |
|