Непоследовательное правило округления связей, используемое в формах Oracle для десятичных значений

Я пытаюсь определить, какое правило округления связей использует Oracle Forms для округления десятичных чисел, извлеченных из базы данных, для отображения в поле более короткой длины. В частности, когда число равноудалено от его соседей (например, 0,5 равноудалено от 0 и 1), какое правило используется для определения того, округляется ли оно в большую или меньшую сторону (см. Ссылку на стандартные правила округления)? В электронной справочной документации Forms рассматривается округление, но не указывается, какое правило округления используется (например, половина от нуля, половина даже или "округление банкира" и т. Д.). Я не мог найти тему на OTN, которая решает эту проблему, либо.

Я пытался выяснить это методом проб и ошибок, но получаю противоречивые результаты. Вот мои тесты...

Для обоих тестовых случаев:
Поле базы данных НОМЕР (20,4)
Поле формы имеет тип Number, длина 30
Маска формата поля формы, установленная программно, является FM999G999G999G999G999G999G999G999G999G999G999G990D90PR (то есть округляется до 2 десятичных знаков)
Поле Форма отображает значение поля базы данных напрямую

Тест 1:
Значение поля базы данных составляет 1,4445
Результат: в поле формы отображается значение 1,44

Тест 2:
Значение поля базы данных 1,445
Результат: в поле формы отображается значение 1,45

Это абсолютно противоречиво. Если использовалось округление "наполовину от нуля" или "наполовину до нечетного", то значение критерия 1 должно отображаться как 1,45 (поскольку последние 5 округляют предыдущие 4 до 5 и повторяются). С другой стороны, если использовалось округление "от половины до нуля" или "от половины до четного", значение теста 2 должно отображаться как 1,44.

Я понимаю, что сохраненные значения в форме не округляются (в соответствии с документацией Oracle), и что это не обязательно приведет к ошибкам расчета. Однако в целях документирования необходимо определить, какое именно правило используется для отображения округленных значений.

Я использую Формы 11gR2.

1 ответ

Решение

Я предполагаю, что правила, которым следуют формы, такие же, как те, что следует базе данных Oracle, как описано здесь:

КРУГЛЫЙ реализуется с использованием следующих правил:

  1. Если n равно 0, то ROUND всегда возвращает 0 независимо от целого числа.
  2. Если n отрицательно, то ROUND(n, целое число) возвращает -ROUND(-n, целое число).
  3. Если n положительно, то

КРУГЛЫЙ (n, целое число) = ЭТАЖ (n * МОЩНОСТЬ (10, целое число) + 0.5) * МОЩНОСТЬ (10, -интегратор)

Однако я не могу понять, почему вы думаете, что его поведение "абсолютно противоречиво":

  • 1.4445 "ближе" к 1.44, чем 1.45, поэтому, безусловно, имеет смысл, что ROUND (1.4445,2) возвращает 1.44. Результат 1.45 будет просто ошибочным.
  • 1.445 равноудалено между 1.44 и 1.45, поэтому либо 1.44, либо 1.45 могут быть верными, и, очевидно, правило Oracle идет за 1.45.
Другие вопросы по тегам