2009-08-18 8 views
6

Perché Oracle non sta utilizzando Bankers rule (il metodo di arrotondamento)?Regola Oracle Bankers

+5

Suppongo che si intenda veramente: - Perché aritmetica decimale utilizzando il tipo di dati NUMBER in un database ORAACLE non utilizza lo schema di arrotondamento a metà noto come arrotondamento dei banchieri. –

+2

Perché Oracle ha più denaro della maggior parte dei banchieri e non vede alcun motivo per seguire i loro consigli? – skaffman

+1

prendere il consiglio di un banchiere ... sembra pericoloso! – lexu

risposta

11

L'aritmetica decimale accurata è un argomento ampio e complesso.

Google "mike colishaw decimale rounding" se si desidera leggere l'ahem Oracle sull'argomento.

Fondamentalmente ci sono molti schemi di arrotondamento che sono possibili: -

everthing rotonda verso il basso - il default nella maggior parte delle lingue tra cui C come Oracle è scritto in C questo è probabilmente il motivo per cui lo fanno.

Arrotondare tutto - raramente visto ma a volte deve essere implementato a causa di oscure regole del mercato e fiscali.

Mezze arrotondamenti di base - qualsiasi cosa sopra .5 arrotonda tutto il resto.

Ampia arrotondatura generosa: nulla al di sotto di .5 giri in giù per tutto il resto.

Arrotondamento dei banchieri: i numeri pari seguono la regola dell'arrotondamento di base, i numeri dispari la regola dell'arrotondamento generoso. Questo è raro vedere nelle banche reali che preferiscono arrotondare se i soldi arrivano nel loro modo e arrotondano quando si dirigono verso i clienti.

ORACLE NUMBER è in realtà un'implementazione Decimal Aritmetica piuttosto buona ed è accurato fino a dove va.

+0

+1 per Oracle pun! –

1

È sempre possibile implementare la propria funzione per l'arrotondamento del banco come descritto here.

1

Arrotondamento del banco da 0,5 a 0: il giro è verso numeri pari.

+0

Oops, ho inserito la "spiegazione" dell'arrotondamento da 0,5 a 1. L'OP non l'ha menzionato. Risolto ora. – Thilo

4

Oracle ha implementato mezzo tondo di distanza da zero:

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> 

Perché non hanno cambiato di arrotondamento Bankers'? Bene, per la maggior parte degli scopi il giro a metà distanza dallo zero è abbastanza buono. In più c'è quel vecchio fallback, cambiarlo probabilmente spezzerebbe troppo la base di codice esistente - sia di Oracle che di tutti i suoi clienti.

2

Vecchio thread, ma qualcuno potrebbe ancora averne bisogno. I galleggianti binari e i doppi binari di Oracle seguono la regola di arrotondamento del banchiere quando si arrotondano a un numero intero. Quindi puoi usarlo. È brutto ma funziona:

 
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 

In questo esempio è necessario moltiplicare e dividere per 100. Non sono stato in grado di capire le specifiche del comportamento, ma selezionare round (to_binary_float (price), 2) per alcuni decimali, il prezzo, non sembra arrotondare costantemente verso l'alto o verso il basso dalle stesse regole. Ho trovato, tuttavia, che arrotondare a un numero intero mi dà costantemente ciò di cui ho bisogno.