Округлення результатів арифметичних операцій у запитах
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)) ЯК Результат З Таблиця ЯК Таблиця |