![]() |
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. |
Así a simple vista, quita el "as intenger", estás forzando a quitar los decimales
|
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!!! |
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; |
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!!!
|
En lugar de hacer el CAST as INTEGER haz un CAST as NUMERIC(6,2)
|
Otias, en cuanto llegue a casa lo pruebo. ¡Gracias!
|
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 |
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 |
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? |
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:
Solo guardará 2 decimales y realizará el total correctamente. Saludos |
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. |
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 00:13:19. |
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