2009-08-18 1 views
6

Почему Oracle не использует Bankers rule (метод округления)?Правило Oracle Bankers

+5

Я предполагаю, что вы действительно имеете в виду: - Почему десятичная арифметика, использующая тип данных NUMBER в базе данных ORAACLE, не использует схему полукругления, известную как Rounders Bankers. –

+2

Потому что у Oracle больше денег, чем у большинства банкиров, и не видно причин брать их советы? – skaffman

+1

Принимая совет банкира ... звучит опасно! – lexu

ответ

11

Точная десятичная арифметика - большой и сложный предмет.

Google "mike colishaw decimal rounding", если вы хотите прочитать гейм Oracle по этому вопросу.

В основном есть много схем округления, которые можно: -

Round Everthing вниз - по умолчанию в большинстве языков, включая C, как Oracle написана на C, это, вероятно, почему они это делают.

Все вокруг - редко видно, но иногда необходимо внедрять из-за неясных рыночных и налоговых правил.

Основное закругление - все выше .5 округляет все остальное округляет.

Щедрый полукруглый - все, что ниже .5 раундов вниз, все еще округляет.

Банкиры Округление - Четные числа следуют правилу основного полукруга, нечетные числа - правило щедрого округления. Это редко встречается в реальных банках, которые предпочитают округлять, если денежные средства приближаются и округляются, когда они идут по пути клиентов.

ORACLE NUMBER на самом деле довольно хорошая десятичная арифметическая реализация и точна насколько это возможно.

+0

+1 для Oracle! –

1

Вы всегда можете реализовать свою собственную функцию для округления банкира, как описано here.

1

округление раунда банкира от 0,5 до 0: округление до четных чисел.

+0

К сожалению, я ввел «объяснение» округления от 0,5 до 1. ОП не упоминал об этом. Исправлено. – Thilo

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. Мне не удалось выяснить особенности поведения, но выберите round (to_binary_float (price), 2) для некоторой десятичной, цены, похоже, не постоянно округляются вверх или вниз по тем же правилам. Однако я обнаружил, что округление до целого числа последовательно дает мне то, что мне нужно.

 Смежные вопросы

  • Нет связанных вопросов^_^