Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-12-2006
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile ¿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.
Responder Con Cita
 



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


La franja horaria es GMT +2. Ahora son las 19:41:47.


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