Неправильно округляет

1. furman2000 16 18.12.15 13:40 Сейчас в теме
Всем доброго дня.
Столкнулся с проблемой округления
Сокруглением:
Окр(СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100),2,0) = 762 509,21 Хотя должно быть 20 копеек

Без округления:
СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100) = 762 509,209523809523

Кто нибудь знает как это победить???
Прикрепленные файлы:
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1550 18.12.15 13:42 Сейчас в теме
(1) furman2000, да, достаточно прочитать справку:
Встроенные функции языка (Script functions)
Окр (Round)
Синтаксис:

Окр(<Число>, <Разрядность>, <РежимОкругления>)
Параметры:

<Число> (обязательный)

Тип: Число.
Исходное число.
<Разрядность> (необязательный)

Тип: Число.
Определяет число знаков дробной части, до которых производится округление. Если параметр отрицательный, то число округляется до соответствующего разряда в целой части, начиная с младших разрядов.
Параметр обязательный, если указан параметр <РежимОкругления>.
Значение по умолчанию: 0.
<РежимОкругления> (необязательный)

Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Значение по умолчанию: Окр15как20.
Возвращаемое значение:

Тип: Число.
Число, полученное в результате округления.
Описание:

Округляет исходное число до нужной разрядности в соответствии с заданным режимом округления.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Пример:

// Округлим цену до сотен рублей
ОкругленнаяЦена = Окр(Цена, -2);

// Округлим цену до копеек
ОкругленнаяЦена = Окр(Цена, 2);

Показать
7. furman2000 16 18.12.15 19:06 Сейчас в теме
(2) Xershi,
Читал, там сказано 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
Я указал 0. Почему у меня 762 509,209523809523 округлилось до 762 509,21
14. Xershi 1550 19.12.15 11:08 Сейчас в теме
(7) furman2000, потому что нужно прочитать (2) и понять (5)
(9) furman2000, дочитать (5) и это не ошибка.
(13) furman2000, все-то стоило внимательно перечитать (5).

Поздравляю!
3. ЧерныйКот 18.12.15 13:46 Сейчас в теме
а системное перечисление явно указать , вместо 0?
4. Olga12 175 18.12.15 13:50 Сейчас в теме
А почему должно быть 20 коп, когда в третьем знаке 9?
R_G_B; mrmasson; vladir; +3 Ответить
8. furman2000 16 18.12.15 19:08 Сейчас в теме
(4) kn,
Потому-что я указал Окр(СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100),2,0)
В округлении ноль. А 0 - если при округлении 1.5 = 1; 1 - если при округлении 1.5 = 2.
11. 32ops 194 18.12.15 23:06 Сейчас в теме
(8)(9) Режим зависит только на округление 1.5. все что больше 1.5 при обоих режимах округлиться в 2 все что меньше в 1, а 1.5 в зависимости от режима. В справке написано только про 1.5, остальное описывать посчитали излишним. Но ошибкой это считать ИМХО неправильно, скорее недосказанность, так что все описано в (5), в том числе и как обойти данную "ошибку"
5. Xershi 1550 18.12.15 13:53 Сейчас в теме
Кто не дочитал до
Тип: РежимОкругления.
Определяет режим округления. Помимо системного перечисления допускается использование числового параметра: 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.
32ops; furman2000; +2 Ответить
9. furman2000 16 18.12.15 19:09 Сейчас в теме
(5) Xershi,
Вам спасибо за совет как обойти данную ошибку.
6. caponid 18.12.15 18:52 Сейчас в теме
Функция ОкруглитьПоИнтервалу(Источник, Интервал = 0.01, ОтбрасыватьОстаток = Истина)
    
    Если Интервал = 0 Тогда Возврат Источник; КонецЕсли; 
    ЧислоИнтервалов = Цел(Источник/Интервал);
    Результат = ЧислоИнтервалов*Интервал;
    Результат = ?(ОтбрасыватьОстаток, Результат, ?((Источник - Результат) >= Интервал/2, Результат + Интервал, Результат));
    Возврат Результат;
    
КонецФункции
Показать
10. R_G_B 18.12.15 21:36 Сейчас в теме
где вы тут ошибку нашли?
вы указываете, что число должно быть округлено до двух знаков после запятой.
Это значит что третий знак либо должен быть отброшен, либо приведет к увеличению второго разряда.
если третий разряд >5, то второй разряд будет увеличен не зависимо от режима округления.
Режим влияет только на округления значения разряда равное 5, т.к. это пограничное значение приводящее к одинаковой погрешности в большую либо меньшую сторону.
12. furman2000 16 19.12.15 10:14 Сейчас в теме
А как же правила арифметики за 4 класс.
15. R_G_B 19.12.15 22:28 Сейчас в теме
(12) furman2000,
собственно все согласно правилам арифметики с тем лишь отличием, что в арифметике 5 всегда округляется в большую сторону, а используемый в 1с метод позволяет регулировать способ округления этого значения.
Для ваших целей можно было бы использовать метод ПривестиЗначение() описания типов с указанием соответсвующих квалификаторов числа.
furman2000; +1 Ответить
13. furman2000 16 19.12.15 10:23 Сейчас в теме
В общем решил сделать так
Цел(СуммаВзаиморасчетов/(1+СтруктураБонусов.ПроцентБонуса1/100)*100)/100
Оставьте свое сообщение

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