Довідковий матеріал

Округлення результатів арифметичних операцій у запитах

1. Якщо в операції ділення заздалегідь відомі порядки чисельника та знаменника, то слід за можливості уникати виконання ділення числа свідомо малого порядку на число свідомо великого порядку. Наприклад, замість:

Абстрактна сцена точного обчислення: дробові числові блоки проходять через механізми ділення, множення та налаштування розрядності.

Методична рекомендація (корисна порада)

1. Якщо в операції ділення заздалегідь відомі порядки чисельника та знаменника, то слід за можливості уникати виконання ділення числа свідомо малого порядку на число свідомо великого порядку. Наприклад, замість:

0.02 / 28346 * 9287492

правильно:

0.02 * 9287492 / 28346

2. Під час виконання арифметичних операцій у запитах до бази даних платформа 1С:Підприємства підтримує точність обчислень до 8 розрядів дробової частини. Проте через особливості роботи різних СУБД у деяких ситуаціях точність результатів може відрізнятися від 8. Докладніше про обчислення розрядності результатів можна прочитати в статті ІТС «Розрядність результатів виразів та агрегатних функцій у мові запитів».

Якщо точність результату виконання запиту до бази даних, що містить

  • арифметичні операції ділення,
  • агрегатні функції СЕРЕДНЄ,
  • арифметичні операції множення, якщо кожен із множників може мати дробову частину,

відрізняється в різних СУБД, то рекомендується до операндів і/або результатів цих операцій застосовувати оператор явного приведення розрядності та точності числових даних:

ВИРАЗИТИ(... ЯК Число(m, n))

Оператор ВИРАЗИТИ слід застосовувати до операндів, якщо на будь-якій СУБД точність отримуваного результату недостатня. Наприклад, потрібно 10 розрядів після коми, а виходить 6.

При цьому зазначена загальна розрядність операндів має бути мінімальною, але не меншою за ту, якої достатньо для подання значень кожного з операндів. Необґрунтоване завищення розрядності може призвести до втрати точності наступних обчислень і дещо знизити швидкість виконання запиту.

Важливо мати на увазі, що в різних СУБД існують різні обмеження на максимальну розрядність десяткових чисел. Найсуворіше обмеження — це 31 розряд у цілих і дробових частинах. Що менше значення розрядності буде зазначено для операндів, то вищою зможе бути точність результату. Наприклад, якщо в результаті потрібно не менше 10 розрядів дробової частини, перший операнд свідомо вміщується в 15 розрядів цілої частини, а другий операнд свідомо вміщується в 5 знаків цілої частини, то вираз може бути записано так:

ВИБРАТИ
ВИРАЗИТИ(Таблиця.Множник * Таблиця.Чисельник ЯК Число(25,10)) / ВИРАЗИТИ(Таблиця.Знаменник ЯК Число(15,10)) ЯК Результат 
З Таблиця ЯК Таблиця

Оператор ВИРАЗИТИ слід застосовувати до результату, якщо точність обчислень на всіх СУБД достатня, але на деяких вона більша, а на інших менша. При цьому зазначена загальна розрядність результату має бути мінімальною, але не меншою за ту, якої достатньо для подання значень результату. Якщо в наведеному прикладі відомо, що Знаменник не може бути меншим за 0.00001, то для подання результату достатньо 20 розрядів цілої частини. У цьому разі вираз може бути записано так:

ВИБРАТИ
ВИРАЗИТИ(Таблиця.Множник * Таблиця.Чисельник / Таблиця.Знаменник ЯК Число(30,10)) ЯК Результат
З Таблиця ЯК Таблиця

Іноді може бути доцільно виконати приведення до необхідної точності як операндів, так і результату. Наприклад:

ВИБРАТИ
ВИРАЗИТИ(ВИРАЗИТИ(Таблиця.Множник * Таблиця.Чисельник ЯК Число(25,10)) / ВИРАЗИТИ(Таблиця.Знаменник ЯК Число(15,10)) ЯК Число(30,10)) ЯК Результат
З Таблиця ЯК Таблиця
Записатися телефоном