Имя: Пароль:
1C
1С v8
Формула округления до целых чисел, кратных нужному
0 Aswed
 
13.03.17
18:04
К концу дня что то ни как не могу придумать универсальный механизм который бы делал округление до целого числа кратного нужному.
например что бы сумма 183 была округленна до числа кратному 5.
Т.е. до 185.
Соответственно 192 до 195
197 до 200 и т.д.

Подскажите формулу.
1 Волшебник
 
модератор
13.03.17
18:05
192 округляется до 190
2 Fragster
 
гуру
13.03.17
18:06
поделить, округлить, умножить
3 Fragster
 
гуру
13.03.17
18:07
ну и (1) + 1
4 Aswed
 
13.03.17
18:07
(1) Это в нормальных случаях))) Тут только плюс фирме)))
5 Волшебник
 
модератор
13.03.17
18:07
(4) Тогда это не округление, а мошенничество.
6 Aswed
 
13.03.17
18:08
(2) Точно!
Спасибо!
7 Fragster
 
гуру
13.03.17
18:08
если надо вверх - то на этапе "округлить" надо округлять вверх, что множество раз было рассмотрено на форуме, в простейшем случае +0.5 и параметр "округлять 1.5 как 1"
8 Волшебник
 
модератор
13.03.17
18:08
Тогда так:
ОкруглённаяСуммаВПользуФирмы = Окр(Сумма / 5 + 0.5) * 5
9 Fragster
 
гуру
13.03.17
18:09
(8)Окр(Сумма / 5 + 0.5, , 0)
10 Aswed
 
13.03.17
18:10
(8) Спасибо!!!

То что надо!
11 Fragster
 
гуру
13.03.17
18:10
(10) в (8) еще и 190 до 195 ;)
12 Волшебник
 
модератор
13.03.17
18:11
«атака на округление»
https://geektimes.ru/post/275914/
13 Aswed
 
13.03.17
18:15
(11) Я проверяю вначале. Если сумма кратная то округлять не надо.
14 azernot
 
13.03.17
18:44
Функция ОкруглитьДО(ИсходноеЧисло, РазрядОкругления = 1, РежимОкругления = 1);
    
    ОстатокОтДеления = ИсходноеЧисло % РазрядОкругления;
    Если РежимОкругления = 1 Тогда
        //Обычный по мат. правилам

        Результат = ИсходноеЧисло - ?(ОстатокОТДеления>=(РазрядОкругления/2), -РазрядОкругления + ОстатокОТДеления, ОстатокОТДеления);
    ИначеЕсли РежимОкругления = 2 Тогда
        //Обычный по мат. правилам, 0.5 округляется в меньшую сторону

        Результат = ИсходноеЧисло - ?(ОстатокОТДеления>(РазрядОкругления/2), -РазрядОкругления + ОстатокОТДеления, ОстатокОТДеления);
    ИначеЕсли РежимОкругления = 3 Тогда
        //В меньшую сторону

        Результат = ИсходноеЧисло - ОстатокОтДеления;
    ИначеЕсли РежимОкругления = 4 Тогда
        //В большую сторону

        Результат = ИсходноеЧисло - ОстатокОтДеления + РазрядОкругления;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции



Вызываем
ОкруглитьДО(183, 5, 4);

Получаем округление до 5 в большую сторону, т.е. до 185
15 Aswed
 
13.03.17
18:47
(14) Вот спасибо!!!!
16 Fragster
 
гуру
13.03.17
18:54
(14) проверял? а почему оно 190 до 195 округляет?
17 Fragster
 
гуру
13.03.17
18:54
(16)+ в режиме "в большую сторону"
18 Fragster
 
гуру
13.03.17
18:55
вот для таких случаев юнит тесты пригождаются
19 azernot
 
14.03.17
10:37
(18) Согласен.

Функция ОкруглитьДО(ИсходноеЧисло, РазрядОкругления = 0.5, РежимОкругления = 3);
    
    ОстатокОтДеления = ИсходноеЧисло % РазрядОкругления;
    Если ОстатокОтДеления = 0 Тогда
        Возврат ИсходноеЧисло;
    КонецЕсли;
    Если РежимОкругления = 1 Тогда
        //Обычный по мат. правилам
        Результат = ИсходноеЧисло - ?(ОстатокОТДеления>=(РазрядОкругления/2), -РазрядОкругления + ОстатокОТДеления, ОстатокОТДеления);
    ИначеЕсли РежимОкругления = 2 Тогда
        //Обычный по мат. правилам, 0.5 округляется в меньшую сторону
        Результат = ИсходноеЧисло - ?(ОстатокОТДеления>(РазрядОкругления/2), -РазрядОкругления + ОстатокОТДеления, ОстатокОТДеления);
    ИначеЕсли РежимОкругления = 3 Тогда
        //В меньшую сторону
        Результат = ИсходноеЧисло - ОстатокОтДеления;
    ИначеЕсли РежимОкругления = 4 Тогда
        //В большую сторону
        Результат = ИсходноеЧисло - ОстатокОтДеления + РазрядОкругления;
    КонецЕсли;
    
    Возврат Результат;
КонецФункции