2009-08-18 10 views
6

¿Por qué Oracle no está utilizando Bankers rule (el método de redondeo)?regla de Oracle Bankers

+5

Supongo que realmente quiere decir: - ¿Por qué la aritmética decimal utilizando el tipo de datos NUMBER en una base de datos ORAACLE no utiliza el esquema de redondeo de medios conocido como redondeo de bancos? –

+2

¿Porque Oracle tiene más dinero que la mayoría de los banqueros, y no ve razón para seguir sus consejos? – skaffman

+1

siguiendo el consejo de un banquero ... ¡suena peligroso! – lexu

Respuesta

11

El aritmético decimal preciso es un tema grande y complejo.

Google 'mike colishaw decimal rounding' si quieres leer el ahem Oracle sobre el tema.

Básicamente hay muchos esquemas de redondeo que son posibles: -

Ronda Everthing abajo - el valor por defecto en la mayoría de idiomas, incluyendo C, como Oracle está escrito en C esto es probablemente por qué lo hacen.

Redondea todo: rara vez se ve, pero de vez en cuando se debe implementar debido a las oscuras reglas de mercado e impuestos.

Medio redondeo básico: cualquier valor por encima de .5 redondea todo lo demás redondea hacia abajo.

Medio redondez generoso: todo lo que se encuentre debajo de .5 redondea hacia abajo todo el resto redondea hacia arriba.

Redondeo de banqueros: los números pares siguen la regla del medio redondeo básico, los números impares son la regla del medio redondeo generoso. Esto rara vez se ve en los bancos reales, que prefieren redondearse si el dinero viene por su camino y redondeando hacia abajo cuando va por el camino del cliente.

NÚMERO DE ORACLE es realmente una buena implementación de Arithmatic decimal y es precisa hasta donde llega.

+0

+1 por juego de palabras de Oracle! –

1

Siempre puede implementar su propia función para el redondeo bancario como se describe here.

1

Ronda de redondeo del banquero de 0,5 a 0: redondea hacia números pares.

+0

Vaya, puse la "explicación" de redondear 0.5 a 1. El OP no lo mencionó. Corregido ahora. – Thilo

4

Oracle ha implementado redonda media de cero:

SQL> select round(22.5) from dual 
    2/

ROUND(22.5) 
----------- 
     23 

SQL> select round(23.5) from dual 
    2/

ROUND(23.5) 
----------- 
     24 

SQL> select round(-23.5) from dual 
    2/

ROUND(-23.5) 
------------ 
     -24 

SQL> select round(-22.5) from dual 
    2/

ROUND(-22.5) 
------------ 
     -23 

SQL> 

¿Por qué no lo cambian al redondeo de los banqueros? Bueno, para la mayoría de los propósitos, la mitad de distancia de cero es lo suficientemente bueno. Además, existe esa vieja alternativa, ya que cambiarla probablemente rompería una gran parte de la base de código existente: la de Oracle y la de todos sus clientes.

2

Hilo viejo, pero alguien puede necesitar esto. Los flotantes binarios y los dobles binarios de Oracle siguen la regla de redondeo del banquero al redondear a un número entero. Entonces puedes usar eso. Es feo pero funciona:

 
given : price = 2.445 
SQL> select round(to_binary_float(price * 100))/100 as price_rounded from dual; 

price_rounded 
------------- 
2.44 

given : price = 2.435 
SQL> select round(to_binary_float(price * 100))/100 as price_rounded from dual; 

price_rounded 
------------- 
2.44 

En este ejemplo, es necesario multiplicar y dividir por 100. No he podido descifrar los detalles del comportamiento, pero selecciono round (to_binary_float (price), 2) para un decimal, precio, no parece redondearse constantemente hacia arriba o hacia abajo con las mismas reglas. Sin embargo, he descubierto que el redondeo a un número entero siempre me da lo que necesito.