Обрезка числа в запросе без округления

1. Intercititude 07.07.21 15:36 Сейчас в теме
Всем доброго дня.
Есть поле в запросе:
РеализацияТоваровУслугТовары.Цена * РеализацияТоваровУслугТовары.ПроцентАвтоматическойСкидки / 100 / 1.2


На выходе к примеру будет число: 3,67500000540833 . Мне же необходимо его обрезать как 3.67
Если делаю выразить 15,2 то система округляет до 3,68. Как этого избежать ?
По теме из базы знаний
Найденные решения
6. FatPanzer 07.07.21 15:56 Сейчас в теме
(4) Ну да. Вы же еще и цену со скидкой округляете, а не конечный результат... То есть у вас и цена изменяется, и результат разный...
Математику пытаетесь обмануть? Бесполезно.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 07.07.21 15:43 Сейчас в теме
Правильно округляет. В запросе округление только по математическим правилам. Все остальные вариации реализуйте программно на свое усмотрение.
Intercititude; +1 Ответить
5. Intercititude 07.07.21 15:55 Сейчас в теме
(2) В (4) описал проблему. Вообще не пойму почему так..
3. FilippovRI 76 07.07.21 15:44 Сейчас в теме
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)) КАК Результат
ИЗ Таблица КАК Таблица


Источник its.1c.ru
4. Intercititude 07.07.21 15:49 Сейчас в теме
(3)
ТОГДА (ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.Цена / 1.2 КАК ЧИСЛО(15, 2))) - ВЫБОР
				КОГДА НЕ РеализацияТоваровУслугТовары.ПроцентАвтоматическойСкидки = 0
					ТОГДА ВЫРАЗИТЬ(РеализацияТоваровУслугТовары.Цена / РеализацияТоваровУслугТовары.ПроцентАвтоматическойСкидки / 100 / 1.2 КАК ЧИСЛО(15, 2))
				ИНАЧЕ 0
			КОНЕЦ


Вот мой код этого поля, но почему то какие то числа он округляет нормальн, какие то криво..

К примеру два числа итоговых:
Если 15,2 : то на выходе 8,56 и 44.39
Если 15,3: 8,567 44,383

Разве не должно быть 8,57 и 44,38 при выразить (15,2) ???
6. FatPanzer 07.07.21 15:56 Сейчас в теме
(4) Ну да. Вы же еще и цену со скидкой округляете, а не конечный результат... То есть у вас и цена изменяется, и результат разный...
Математику пытаетесь обмануть? Бесполезно.
8. Intercititude 07.07.21 16:00 Сейчас в теме
(6) Подскажите пожалуйста как переписать условие тогда ?
7. soft_wind 07.07.21 15:56 Сейчас в теме
просто отнимите 0.5
как в примере
ВЫРАЗИТЬ( ( ВашаМегаФормула ) - 0.5 КАК Число(15,2)) как Результат
nikolaymx; Agrozentr; SanyMaga; ffvv; AndrewVVS; Monex; simuljakr; +7 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот