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)
-   -   Redondeos con Firebird 2.0 (https://www.clubdelphi.com/foros/showthread.php?t=39088)

Jose_T 10-01-2007 12:20:00

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.


Casimiro Notevi 10-01-2007 14:18:19

Así a simple vista, quita el "as intenger", estás forzando a quitar los decimales

Jose_T 10-01-2007 15:13:31

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

Casimiro Notevi 10-01-2007 16:10:54

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.

Jose_T 10-01-2007 16:37:28

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

fdelamo 10-01-2007 17:35:57

En lugar de hacer el CAST as INTEGER haz un CAST as NUMERIC(6,2)

Jose_T 10-01-2007 17:55:06

Otias, en cuanto llegue a casa lo pruebo. ¡Gracias!

Jose_T 10-01-2007 19:10:18

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

Lepe 10-01-2007 21:32:13

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

Jose_T 11-01-2007 02:24:24

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 :D

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?

Lepe 11-01-2007 11:54:21

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

Jose_T 11-01-2007 12:32:44

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.

rastafarey 19-01-2007 19:57:02

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.


La franja horaria es GMT +2. Ahora son las 05:04:22.

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