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 10-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Redondeos con Firebird 2.0

Hola a todos.

Probad a ejecutar esta sentencia en Firebird, y decidme si estoy loco, o que:


SELECT
CAST(1.5 * (20.45 ) * 100 AS INTEGER) / 100,
CAST(1.5 * (20.45 - 0) * 100 AS INTEGER) / 100
FROM una_tabla_cualquiera

El primer campo devuelve 30,68, y el segundo 30,67. ¿Hay alguna explicación lógica?
He probado a poner - 0.0 (por si fuese un problema de tipos de datos), y seguimos en las mismas. El resultado correcto del redondeo de 30.675 es 30.68, pero no se cómo llegar hasta él.

Gracias.

Responder Con Cita
  #2  
Antiguo 10-01-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Así a simple vista, quita el "as intenger", estás forzando a quitar los decimales
Responder Con Cita
  #3  
Antiguo 10-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Oño, ahí está la magia del asunto. Para hacer los redondeos (sin usar rounds de udfs ni leches), pretendía aplicar esto, pero al restar (aunque sea un 0) se "escacharra" el resultado.

Prueba a ejecutarlo y te sorprenderás.

Bueno, ¿y cómo redondeáis vosotros? Help please!!!
Responder Con Cita
  #4  
Antiguo 10-01-2007
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.042
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Bueno, la verdad es que en la base de datos no acostumbro a redondear nada, guardo todo según lo calculado desde Delphi.
Algo asi como esta función:
Código:
function Redondeo (valor:Double; decim:integer = 0): Double;
var
  factor: Double;
begin
  factor := IntPower(10,decim);

  if valor > 0 then
    Result := (TRUNC((valor*factor)+0.5)) / factor
  else
    Result := (TRUNC((valor*factor)-0.5)) / factor;
end;
Y el resto de valores los guardo con todos sus decimales.
Responder Con Cita
  #5  
Antiguo 10-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Es que en mi tabla de detalle de facturas tengo un campo BaseImponible que es COMPUTED BY. Lo creé así por consistencia y... EN QUÉ HORA!!!
Responder Con Cita
  #6  
Antiguo 10-01-2007
fdelamo fdelamo is offline
Miembro
 
Registrado: oct 2005
Ubicación: Sotoca de Tajo - Guadalajara (ESP)
Posts: 86
Poder: 19
fdelamo Va por buen camino
En lugar de hacer el CAST as INTEGER haz un CAST as NUMERIC(6,2)
Responder Con Cita
  #7  
Antiguo 10-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Otias, en cuanto llegue a casa lo pruebo. ¡Gracias!
Responder Con Cita
  #8  
Antiguo 10-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Nada, el resultado es el mismo que si no hubiese redondeado.

Juer, vaya venta. ¿Ninguno hace redondeos usando campos COMPUTED BY en la propia base de datos?

Ayudaaa
Responder Con Cita
  #9  
Antiguo 10-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Pues no, no se redondea nada.

- Primero porque es ilegal. Legalmente (en España) se permite redondear la última cantidad (la que se paga) pero no en cálculos intermedios, por ende, se guarda todito con las cifras que viene.

- Segundo, usar siempre Numeric(9,2) y dialecto 3 para todos los campos que lleven decimales. Esto indica a Firebird que use un tipo INT64 para las cantidades, ya que se sabe que los campos de tipo Float no son fiables para datos contables.

- Tercero, dado que guardamos todo con 2 decimales, estamos usando el equivalente a tipo Currency de delphi, que ya hace redondeos como debe, no haría falta redondear nada (salvo excepciones como que exijan usar 6 decimales para todas los cálculos y después redondear).

Quizás te sirva el hilo "como redondea tu base de datos"

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #10  
Antiguo 11-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
LOL !

¿Quieres decir que en mi factura debo mostrar importes con más de dos dígitos decimales? Si no redondeo, puedo obtener cifras como 45,779 € y coñe, resulta que no es una gestión de surtidores de gasolineras

Y lo que es peor, si redondeas para pintar las líneas de la factura, pero no internamente, al final puedes obtener una cifra que descuadre de la suma de los importes que aparecen en cada línea de la factura. ¿Es eso entonces legal? Quiero decir, que si en la factura aparecen tres lineas, con importes 10, 20 y 30, el total deberá ser en total 60, y no 61 ni 60.79. Sobre todo porque un cliente podría decir "oye oye, que no sabes sumar".

Y si resulta que siempre cuadra, porque el redondeo por línea no es tan significativo como para mover un solo céntimo en el total de la factura, entonces lo mismo me da, que me da lo mismo, redondear en la BD, que en el papel. ¿No?
Responder Con Cita
  #11  
Antiguo 11-01-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
En un DBEdit, asigna 2 decimales al campo en cuestión, después escribe 45,779 y saca el foco del control DBEdit, mostrará 45,78. Haz la prueba.


Cita:
¿Quieres decir que en mi factura debo mostrar importes con más de dos dígitos decimales?
No. Lee de nuevo mi mensaje, sobre todo el punto segundo y tercero.

Código Delphi [-]
FacturaTotal.AsCurrency := FacturaBaseimponible.AsCurrency * 1.16;
Solo guardará 2 decimales y realizará el total correctamente.


Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #12  
Antiguo 11-01-2007
Jose_T Jose_T is offline
Miembro
 
Registrado: may 2004
Posts: 15
Poder: 0
Jose_T Va por buen camino
Creo que no me he explicado bien.

En el TDBEdit se mostrará perfectamente, pero cuando toca escribir sobre un documento Word, o aparece redondeado (como hace un TDBEdit), o metes todos los decimales.

Siendo así, si redondeas en cada línea, o la suma de las líneas coincide en el total de la factura, o ahí sí que estás incurriendo en ilegalidad.

En ese caso, ¿por qué dejar la labor del redondeo a Delphi, y no al gestor de bases de datos? Al fin y al cabo, el objetivo es el mismo.
Responder Con Cita
  #13  
Antiguo 19-01-2007
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Mira busque aqui el mismo club del algo asi como trabajando con numeric veras por que eso resultados inesterados.
esto 1.5 * (20.45 - 0) * 100
lo debrias escribir como 1.50 * (20.45 - 0.00) * 100.00
Y veras que las cosas iran como quieres que vallan.

Pero te recomiendo que leas lo que te dije antes y veras que tiene logica.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
alguien ha utilizado Firebird DDX provider? (conectarse con db en firebird!) JuanErasmo .NET 1 04-11-2006 16:17:12
problemas con float y redondeos wonder boy Firebird e Interbase 17 27-12-2005 20:59:06
Problemas con Redondeos AGAG4 Varios 4 14-11-2005 23:38:44
Firebird : Llamado para probadores de Firebird 2.0 JOSEPE Firebird e Interbase 0 12-03-2005 20:33:18
Problemas Firebird Super Server 1.5 con RFunc Firebird v 1.0 Prophoenix Firebird e Interbase 1 09-03-2004 11:40:48


La franja horaria es GMT +2. Ahora son las 22:24: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
Copyright 1996-2007 Club Delphi