2009-08-18 33 views
6

Tại sao Oracle không sử dụng Bankers rule (phương thức làm tròn)?Quy tắc làm việc của Oracle Bankers

+5

Tôi đoán bạn thực sự có nghĩa là: - Tại sao số thập phân số học sử dụng các kiểu dữ liệu số trong một cơ sở dữ liệu ORAACLE không sử dụng nửa tròn chương trình được gọi là ngân hàng làm tròn. –

+2

Bởi vì Oracle có nhiều tiền hơn so với hầu hết các chủ ngân hàng, và không thấy lý do gì để đưa ra lời khuyên của họ? – skaffman

+1

lấy lời khuyên của ngân hàng ... âm thanh nguy hiểm! – lexu

Trả lời

11

Số thập phân chính xác là một chủ đề lớn và phức tạp.

Google 'mike colishaw decimal rounding' nếu bạn muốn đọc ahem Oracle về chủ đề này.

Về cơ bản có rất nhiều phương án làm tròn mà có thể xảy ra: -

Vòng everthing xuống - mặc định trong hầu hết các ngôn ngữ bao gồm C như Oracle được viết bằng C này có lẽ là lý do tại sao họ làm điều này.

Làm tròn mọi thứ - hiếm khi được nhìn thấy nhưng đôi khi cần được triển khai do các quy tắc về thuế và thị trường không rõ ràng.

Nửa làm tròn cơ bản - bất kỳ thứ gì ở trên .5 làm tròn mọi thứ khác làm tròn xuống.

Làm tròn một nửa hào phóng - bất kỳ thứ gì dưới đây .5 làm tròn mọi thứ khác tròn lên.

Làm tròn ngân hàng - Số chẵn theo quy tắc Nửa vòng cơ bản, số lẻ quy tắc Làm tròn nửa vòng. Điều này hiếm khi được nhìn thấy trong các ngân hàng thực tế mà thích làm tròn lên nếu các moneys đến thier cách và làm tròn xuống khi nó đi theo cách của khách hàng.

ORACLE NUMBER thực sự là một cách thực hiện Decimal Arithmatic khá tốt và chính xác như mong đợi.

+0

+1 cho chơi chữ của Oracle! –

1

Bạn luôn có thể thực hiện chức năng của riêng mình cho làm tròn của ngân hàng như được mô tả here.

1

Vòng làm tròn của ngân hàng là 0,5 đến 0: vòng tròn hướng về số chẵn.

+0

Rất tiếc, tôi đặt vào phần "giải thích" làm tròn 0,5 đến 1. OP không đề cập đến nó. Đã sửa lỗi. – Thilo

4

Oracle đã thực hiện nửa vòng đi từ 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> 

Tại sao họ không thay đổi nó để làm tròn Bankers'? Vâng, đối với hầu hết các mục đích , cách nhau một nửa từ số là đủ tốt. Thêm vào đó là dự phòng cũ, thay đổi nó có khả năng sẽ phá vỡ quá nhiều của codebase hiện tại - của Oracle cũng như tất cả các khách hàng của họ.

2

Chủ đề cũ nhưng ai đó vẫn có thể cần điều này. Các phao nhị phân của Oracle và nhị phân tăng gấp đôi theo quy tắc làm tròn của ngân hàng khi làm tròn đến một số nguyên. Vì vậy, bạn có thể sử dụng nó. Nó xấu xí nhưng hoạt động:

 
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 

Nhân và chia cho 100 là cần thiết trong ví dụ này. Tôi đã không thể tìm ra các chi tiết cụ thể của hành vi, nhưng chọn vòng (to_binary_float (price), 2) cho một số thập phân, giá, dường như không liên tục tròn lên hoặc xuống theo các quy tắc tương tự. Tôi đã tìm thấy, tuy nhiên, làm tròn đến một số nguyên luôn mang lại cho tôi những gì tôi cần.