2009-08-18 132 views
6

爲什麼Oracle不使用Bankers rule(舍入方法)?Oracle銀行家規則

+5

我認爲你真的是指: - 爲什麼在ORAACLE數據庫中使用NUMBER數據類型的十進制算術不使用稱爲Bankers Rounding的半舍入方案。 – 2009-08-18 08:47:38

+2

因爲甲骨文比大多數銀行家有更多的錢,並且沒有理由接受他們的建議? – skaffman 2009-08-18 08:59:42

+1

接受銀行家的建議......聽起來很危險! – lexu 2009-08-19 04:44:45

回答

11

準確的十進制算術是一個大而複雜的問題。

谷歌'麥克colishaw十進制四捨五入',如果你想閱讀關於這個問題的阿赫爾甲骨文。

基本上有許多舍入的計劃,這是可能的: -

回合下來寄託都 - 在大多數語言,包括甲骨文是寫在C C默認這可能是爲什麼他們這樣做。

將所有事情湊到一起 - 很少見到,但偶爾需要實施,因爲市場和稅收規則不明確。

基本半舍入 - 任何高於.5的東西將其他任何東西向上舍入。

慷慨的半舍入 - 低於.5的任何東西都捨棄其他舍入。

銀行家舍入 - 偶數數字遵循基本半舍入規則,奇數是慷慨舍入舍入規則。這在實際銀行中很少見到,如果資金越來越多,他們更傾向於四捨五入,並且在走向客戶的路上走向四捨五入。

ORACLE NUMBER實際上是一個相當不錯的Decimal Arithmatic實現,並且儘可能地精確。

+0

+1 for Oracle pun! – 2009-08-20 17:35:03

1

您可以隨時按照here的描述執行自己的銀行職員舍入功能。

1

銀行家的舍入回合的0.5到0:這輪到偶數。

+0

哎呀,我把0.5到1的「解釋」放在一起.OP沒有提到它。現在修復。 – Thilo 2009-08-18 08:54:21

4

Oracle實現一輪一半遠離零

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> 

他們爲什麼不將其更改爲銀行家舍入?那麼,對於大多數目的圓零一半是足夠好。此外,還有一箇舊的回退,改變它可能會打破現有的代碼庫 - Oracle本身以及所有客戶。

2

舊的線程,但有人可能仍然需要這個。當四捨五入到整數時,Oracle的二進制浮點數和二進制雙精度值遵循銀行家的舍入規則。所以你可以使用它。這是醜陋的,但它的工作原理:

 
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 

在這個例子中乘以100除。我一直無法弄清楚行爲的具體情況,但選擇一輪(to_binary_float(price),2)對於一些小數,價格,似乎並不總是按同樣的規則向上或向下取整。然而,我發現,四捨五入的數字始終給我我需要的東西。