FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
Así a simple vista, quita el "as intenger", estás forzando a quitar los decimales
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#3
|
|||
|
|||
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!!! |
#4
|
||||
|
||||
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;
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#5
|
|||
|
|||
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!!!
|
#6
|
|||
|
|||
En lugar de hacer el CAST as INTEGER haz un CAST as NUMERIC(6,2)
|
#7
|
|||
|
|||
Otias, en cuanto llegue a casa lo pruebo. ¡Gracias!
|
#8
|
|||
|
|||
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 |
#9
|
||||
|
||||
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. |
#10
|
|||
|
|||
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? |
#11
|
||||
|
||||
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#12
|
|||
|
|||
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. |
#13
|
||||
|
||||
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. |
|
|
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 17:17:12 |
problemas con float y redondeos | wonder boy | Firebird e Interbase | 17 | 27-12-2005 21:59:06 |
Problemas con Redondeos | AGAG4 | Varios | 4 | 15-11-2005 00:38:44 |
Firebird : Llamado para probadores de Firebird 2.0 | JOSEPE | Firebird e Interbase | 0 | 12-03-2005 21:33:18 |
Problemas Firebird Super Server 1.5 con RFunc Firebird v 1.0 | Prophoenix | Firebird e Interbase | 1 | 09-03-2004 12:40:48 |
|