Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ¿Cómo redondea tu base de datos? (https://www.clubdelphi.com/foros/showthread.php?t=38102)

Al González 02-12-2006 20:18:41

¿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. :)

sinalocarlos 03-12-2006 01:18:59

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)

kuan-yiu 04-12-2006 11:22:04

Oracle9i Enterprise Edition Release 9.2.0.6.0: -10,23 y 10,23

Paoti 06-12-2006 02:46:44

Oracle 8.1.7.0.0


-10,23 10,23

Gydba 11-12-2006 22:51:37

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.

Meinard 28-02-2007 00:56:56

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.

rruz 28-02-2007 05:42:10

Mis Resultados

-10.23 10.23

Mysql 5.0.16 nt


La franja horaria es GMT +2. Ahora son las 17:22:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi