Округление результатов арифметических операций в запросах
Область применения: управляемое приложение, мобильное приложение, обычное приложение.
Методическая рекомендация (полезный совет)
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)) КАК Результат
ИЗ Таблица КАК Таблица
Как в 1с округлить до целого числа
как в 1с округлить число в меньшую сторону?
Например число 7,9 надо округлить до 7
Вот мое выражение, только округляет в большую
СтрокаТабличнойЧасти.КолКуп = ОКР(СтрокаТабличнойЧасти.цена/100*30/200);
А что по этому поводу говорит СП?
совсем СП украли
Цел (Int)
Синтаксис:
Цел()
Параметры:
(обязательный)
Тип: Число. Исходное число.
Возвращаемое значение:
Тип: Число. Результат выделения целой части.
Описание:
Вычисляет целую часть переданного числа, полностью отсекая дробную часть.
Пример:
МожноКупить = Цел(Наличность/Цена);
На крайняк отними 0.5 и округляй
Что-то в последнее время пошло много округлений.
(1) он не знает, что искать
ЕГЭ forever! люди уже не знают, что такое целая часть числа
в (0) вранье детектед, ОКР(7.9/100*30/200)=0 🙂
(5) вообще то я про 3-ий параметр «РежимОкругления»
Тип: Число.
Исходное число.
Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр .
Значение по умолчанию: 0
(необязательный)
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 — если при округлении 1.5 = 1; 1 — если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20
т.е.
окр(бла-бла-бла,0, РежимОкругления.Окр15как10)
(9) а в меньшую сторону надо округлить что?
(9) Это не то, что нужно.
Автор неправильно использует терминологию. Ему нужно не округление, а отбрасывание дробной части. Как это делать, в теме уже ответили.
(11) Это почему ты так решил? Или ты задачу ставил?
Имхо у автора частный случай когда нужно целый, завтра понадобиться с точностью до 10 копеек, или до 100 руб.
Так что окр более универсальный в этом случае
Как в 1с 8 округлить число до целого?
Для округления чисел во встроенном языке на платформе 1С:Предприятие 8 существует две функции:
1) Функция Окр()
Функция Окр() выполняет округление числового значения до ближайшего целого вверх или вниз:
Сообщить(Окр(14.5)); // 15
Округление пограничных значений выполняется по математическим правилам: значения, заканчивающиеся на 5 округляются вверх. Но это поведение можно изменить, указав третий параметр функции как РежимОкругления.Окр15как10 :
Окр(14.5, 0, РежимОкругления.Окр15как10);
2) Функция Цел()
Функция Цел() выполняет усечение числового значения до ближайшего целого. Усечение всегда выполняется вниз:
Сообщить(Цел(14.5)); // 14
Читайте также:
Функция Окр()
Функция Окр() округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Доступность
Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример использования
Пример кода с использованием функции Окр() :
ИсходноеЧисло = 14.5; Сообщить(Окр(ИсходноеЧисло, 0, РежимОкругления.Окр15как10)); // 14 Сообщить(Окр(ИсходноеЧисло)); // 15 Сообщить(Окр(ИсходноеЧисло, -1)); // 10