FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
¿Cómo redondea tu base de datos?
¡Hola a todos!
Hace tiempo resolví en Delphi el a veces desesperante problema aritmético que tiene que ver con la forma en que se redondea una fracción de unidad a n dígitos decimales, cuando dicha fracción termina con un 5 en la posición n + 1 después del punto. Es decir, ¿hacia dónde se redondea cuando la cifra está exactamente a la mitad de su posición decimal inmediata superior? ¿hacia arriba? (infinito positivo), ¿hacia abajo? (infinito negativo), ¿hacia el cero?, ¿hacia el par más cercano?, ¿hacia el infinito más cercano?. Se rumora que depende del procesador, de la configuración regional del sistema operativo, de la posición de Júpiter respecto al Sol, del estado de ánimo de Doña Sofía, etc. El hecho es que preferí crearme un grupo de funciones que redondearan bajo el método que yo eligiera y así darle fin a esos problemas. Pero obviamente, esta ventaja sólo está disponible en código Delphi y no a nivel de bases de datos (a menos que exporte las funciones como UDFs). Ahora mi atención se dirige hacia la manera de redondear en código SQL (dentro de vistas, procedimientos almacenados y disparadores de bases de datos). La primera pregunta que me viene a la mente es: ¿Redondearán todos los manejadores de bases de datos (Firebird, Oracle, MySQL, PostgreSQL, SQL Server, Informix, DB2, etc.) de la misma manera? Apostaría una memoria USB sin tapa a que no. Como ven, son cinco los tipos de redondeo que identifico —aunque el estándar IEEE 754 define sólo cuatro (al parecer no menciona el tercero de la lista)—: 1. De Gauss / Del banquero / Imparcial / Al par Redondea al par más cercano. -2.5 ≈ -2, -1.5 ≈ -2, 1.5 ≈ 2, 2.5 ≈ 2 2. Hacia el cero. Redondea hacia la cifra más cercana a cero. -2.5 ≈ -2, -1.5 ≈ -1, 1.5 ≈ 1, 2.5 ≈ 2 3. Hacia el infinito. Redondea hacia la cifra más lejana de cero. -2.5 ≈ -3, -1.5 ≈ -2, 1.5 ≈ 2, 2.5 ≈ 3 4. Hacia el infinito positivo. Redondea hacia la cifra más cercana al infinito positivo. -2.5 ≈ -2, -1.5 ≈ -1, 1.5 ≈ 2, 2.5 ≈ 3 5. Hacia el infinito negativo. Redondea hacia la cifra más cercana al infinito negativo -2.5 ≈ -3, -1.5 ≈ -2, 1.5 ≈ 1, 2.5 ≈ 2 Quiero hacer aquí un paréntesis para poner una referencia a mi último descubrimiento: .NET sólo redondea de las formas 1 y 3 (es casi tan triste como el capítulo de la función _CopyObject). Pero bueno, es fin de semana y para muchos hay cosas mejores que hacer que leer los Expedientes X de Al González, alias el Fox Pro Mulder; así que vayamos directo al propósito final de este mensaje, el cual es averiguar qué tipo de redondeo utilizan los diferentes servidores de bases de datos. Ejecuten esta sentencia SQL sobre alguna base de datos que tengan disponible: Select Cast (-10.225 As Decimal (10, 2)), Cast (10.225 As Decimal (10, 2)) From Tabla (donde “Tabla” es el nombre de cualquier tabla que contenga al menos un registro). Sólo nos interesa la primera fila (renglón) de resultados (para ello pude haber sugerido añadir un «First 1», pero tal vez no sea compatible con todos los tipos de base de datos). Mis resultados fueron: Firebird 1.5: -10.23 y 10.23 Tipo de redondeo 3 (hacia el infinito). Ahora les pido de la manera más cordial que expongan en mensajes subsecuentes cuáles fueron sus resultados. Nos será útil a todos saber si existe un estándar de redondeo parcial o totalmente respetado por la mayoría de las bases de datos o si cada fabricante lo hace como le vino en gana. Dependiendo de tales resultados, cuidaré la forma de hacer el redondeo a nivel SQL en el futuro (sugiero lo mismo al lector). Un abrazo al infinito y más allá. Al González. Última edición por Al González fecha: 02-12-2006 a las 20:30:00. |
#2
|
|||
|
|||
A mi me salio
-10.23 10.23 en Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2) |
#3
|
||||
|
||||
Oracle9i Enterprise Edition Release 9.2.0.6.0: -10,23 y 10,23
|
#4
|
||||
|
||||
Oracle 8.1.7.0.0
-10,23 10,23
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás... análisis de información análisis y diseño de sistemas Paoti Rios Reséndiz |
#5
|
|||
|
|||
Buenas a todos,
Hasta donde sé M$ ha optado en muchos sistemas por el método del banquero que le dicen (si me habrá traido dolores de cabeza en el VB), no imagino porque lo hiría a cambiar alguien que nunca cambia Por cierto, con Firebird 2.0 RC2 (desconozco si es igual en la última versión pues no he tenido tiempo pa' instalarla) me da lo mismo que para la 1.5 que bien mencionó el creador del post.
__________________
Suerte .: Gydba :. |
#6
|
|||
|
|||
Como hacerlo en Delphi??
A mi me gustaría saber de que manera puedo hacer que en Delphi me redondie de igual manera que en Firebird utilizando el método 3 que es hacia el infinito, mi problema es que al yo mostrar una cantidad como 0.825 me muestra $0.82 utilizando variable currency y la función CurrToStrF ó FormatCurr y al guardarla en un numeric(10, 2) en firebird me muestra 0.83, entonces no es el mismo número el que yo le muestro al usuario que el que guardo en BD, me interesa poder controlar la forma del redondeo en Delphi.
|
#7
|
||||
|
||||
Mis Resultados
-10.23 10.23 Mysql 5.0.16 nt |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como guardar .JPG como Bitmap en Base de Datos | Javi2 | Gráficos | 4 | 25-03-2007 17:21:57 |
Como Trabajar Con Base De Datos? | D-MO | Conexión con bases de datos | 4 | 25-08-2005 21:56:39 |
Como pasar de xml a una base de datos? | Juanan | MySQL | 0 | 11-02-2004 23:10:24 |
como cerrar una base de datos con ADO | viajero2015 | Conexión con bases de datos | 1 | 05-11-2003 07:49:20 |
Como conectarme a una base de datos como postgres o mysql?? | marys | MySQL | 4 | 08-05-2003 11:34:08 |
|