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

Respuesta
 
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: 29
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
  #2  
Antiguo 03-12-2006
sinalocarlos sinalocarlos is offline
Miembro
 
Registrado: sep 2006
Posts: 152
Poder: 18
sinalocarlos Va por buen camino
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)
Responder Con Cita
  #3  
Antiguo 04-12-2006
Avatar de kuan-yiu
[kuan-yiu] kuan-yiu is offline
Miembro Premium
 
Registrado: jun 2006
Ubicación: Galicia. España.
Posts: 1.017
Poder: 19
kuan-yiu Va camino a la fama
Oracle9i Enterprise Edition Release 9.2.0.6.0: -10,23 y 10,23
Responder Con Cita
  #4  
Antiguo 06-12-2006
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 11-12-2006
Gydba Gydba is offline
Miembro
 
Registrado: ene 2004
Ubicación: Argentina
Posts: 673
Poder: 21
Gydba Va por buen camino
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 :.
Responder Con Cita
  #6  
Antiguo 28-02-2007
Meinard Meinard is offline
Registrado
 
Registrado: feb 2007
Posts: 3
Poder: 0
Meinard Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 28-02-2007
Avatar de rruz
[rruz] rruz is offline
Miembro Premium
 
Registrado: jun 2006
Posts: 146
Poder: 18
rruz Va por buen camino
Mis Resultados

-10.23 10.23

Mysql 5.0.16 nt
Responder Con Cita
Respuesta



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 06:07:24.


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