Всем доброго дня.
Столкнулся с проблемой округления
Сокруглением:
Окр(СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100),2,0) = 762 509,21 Хотя должно быть 20 копеек
Без округления:
СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100) = 762 509,209523809523
Кто нибудь знает как это победить???
Столкнулся с проблемой округления
Сокруглением:
Окр(СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100),2,0) = 762 509,21 Хотя должно быть 20 копеек
Без округления:
СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100) = 762 509,209523809523
Кто нибудь знает как это победить???
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) furman2000, да, достаточно прочитать справку:
Встроенные функции языка (Script functions)
Окр (Round)
Синтаксис:
Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:
<Число> (обязательный)
Тип: Число.
Исходное число.
<Разрядность> (необязательный)
Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Возвращаемое значение:
Тип: Число.
Число, полученное в результате округления.
Описание:
Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);
// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);
ПоказатьОкр (Round)
Синтаксис:
Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:
<Число> (обязательный)
Тип: Число.
Исходное число.
<Разрядность> (необязательный)
Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Возвращаемое значение:
Тип: Число.
Число, полученное в результате округления.
Описание:
Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:
// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);
// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);
(8)(9) Режим зависит только на округление 1.5. все что больше 1.5 при обоих режимах округлиться в 2 все что меньше в 1, а 1.5 в зависимости от режима. В справке написано только про 1.5, остальное описывать посчитали излишним. Но ошибкой это считать ИМХО неправильно, скорее недосказанность, так что все описано в (5), в том числе и как обойти данную "ошибку"
Кто не дочитал до
То когда значение 0, то 1.4 это 1, 1.5 это 1, а 1.6 это 2. А когда значение 1, то 1.4 это 1, а 1.5 это 2 и 1.6 это 2!
Так что вам нужно получить значение через функцию ЦЕЛ, а затем результат поделить на 100.
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
То когда значение 0, то 1.4 это 1, 1.5 это 1, а 1.6 это 2. А когда значение 1, то 1.4 это 1, а 1.5 это 2 и 1.6 это 2!
Так что вам нужно получить значение через функцию ЦЕЛ, а затем результат поделить на 100.
Функция ОкруглитьПоИнтервалу(Источник, Интервал = 0.01, ОтбрасыватьОстаток = Истина)
Если Интервал = 0 Тогда Возврат Источник; КонецЕсли;
ЧислоИнтервалов = Цел(Источник/Интервал);
Результат = ЧислоИнтервалов*Интервал;
Результат = ?(ОтбрасыватьОстаток, Результат, ?((Источник - Результат) >= Интервал/2, Результат + Интервал, Результат));
Возврат Результат;
КонецФункции
Показать
где вы тут ошибку нашли?
вы указываете, что число должно быть округлено до двух знаков после запятой.
Это значит что третий знак либо должен быть отброшен, либо приведет к увеличению второго разряда.
если третий разряд >5, то второй разряд будет увеличен не зависимо от режима округления.
Режим влияет только на округления значения разряда равное 5, т.к. это пограничное значение приводящее к одинаковой погрешности в большую либо меньшую сторону.
вы указываете, что число должно быть округлено до двух знаков после запятой.
Это значит что третий знак либо должен быть отброшен, либо приведет к увеличению второго разряда.
если третий разряд >5, то второй разряд будет увеличен не зависимо от режима округления.
Режим влияет только на округления значения разряда равное 5, т.к. это пограничное значение приводящее к одинаковой погрешности в большую либо меньшую сторону.
(12) furman2000,
собственно все согласно правилам арифметики с тем лишь отличием, что в арифметике 5 всегда округляется в большую сторону, а используемый в 1с метод позволяет регулировать способ округления этого значения.
Для ваших целей можно было бы использовать метод ПривестиЗначение() описания типов с указанием соответсвующих квалификаторов числа.
собственно все согласно правилам арифметики с тем лишь отличием, что в арифметике 5 всегда округляется в большую сторону, а используемый в 1с метод позволяет регулировать способ округления этого значения.
Для ваших целей можно было бы использовать метод ПривестиЗначение() описания типов с указанием соответсвующих квалификаторов числа.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот