Имя: Пароль:
1C
 
Округление в большую сторону ОкрБ(0.12, 1) = 0.2. Как максимально эффективно?
0 Гений 1С
 
гуру
21.02.21
12:38
Что-то я не нашел такой функции в 1С, поэтому написал свою:

Функция ОкрБольш(Ч, Разрядность) Экспорт
    Ц = Окр(Ч, Разрядность);
    Если Ц >= Ч Тогда
        Возврат Ц;
    КонецЕсли;
    Если Разрядность >= 0 Тогда
        Возврат Ц + 1/Pow(10, Разрядность);
    Иначе
        Возврат Ц + Pow(10, -Разрядность);
    КонецЕсли;
КонецФункции


А как правильно?
1 ДенисЧ
 
21.02.21
12:44
Если положительное, то Цел(1.12 + 1)
2 RomanYS
 
21.02.21
12:52
Ц = Окр(Ч, Разрядность);
   Возврат Ц + ?(Ц >= Ч, 0, Pow(10, -Разрядность));
3 Ненавижу 1С
 
гуру
21.02.21
13:44
(0) у тебя боязнь работы с отрицательными степенями?
4 Ненавижу 1С
 
гуру
21.02.21
13:50
Функция ОкрБольш(Ч, Разрядность=0) Экспорт
    Возврат Окр(Ч+Pow(10, Разрядность)/2, Разрядность, РежимОкругления.Окр15как10);
КонецФункции
5 Ненавижу 1С
 
гуру
21.02.21
13:52
6 RomanYS
 
21.02.21
13:58
(4) минус похоже потерял, а так даже покрасивше
7 volfy
 
21.02.21
13:59
+0,5 и обычное округление.
8 RomanYS
 
21.02.21
14:04
(7) Не совсем обычное и не совсем 0,5... более менее (с одной большой ошибкой) это и предлагается в (4)
9 Ненавижу 1С
 
гуру
21.02.21
14:05
(4) да, степень -Разрядность
10 Гений 1С
 
гуру
21.02.21
14:22
(3) честно говоря, не помню. Проверил на калькуляторе 10 в степени -2 не равно -0.01
11 Гений 1С
 
гуру
21.02.21
14:23
(4) проверь при параметрах (0.1, 1) даст 0.1 или 0.2?
12 Ненавижу 1С
 
гуру
21.02.21
14:31
(11) смотри (9)
13 Ненавижу 1С
 
гуру
21.02.21
14:38
(10) а должно быть?
14 Guk
 
21.02.21
16:55
если это гений, то я то тогда кто?...
15 Ёпрст
 
гуру
21.02.21
17:53
(0) почти во всех типовых, общий модуль, типа Ценообразование:


// Округляет число по заданному порядку. Если задано (=Истина) "ОкруглятьВБольшуюСторону",
// то число 123.37 при порядке округление 0.5 превратиться в 123.50, а число 0.1
// при порядке округления 5 станет равным 5.
//
// Параметры:
//  Число                    - исходное число
//  ПорядокОкругления        - элемент перечисления Порядки окгугления:
//                             "шаг" округления (0.01 (арифметическое), 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100)
//  ОкруглятьВБольшуюСторону - булево, определяет способ округления: если Истина,
//                             то при порядке округления "5" 0.01 будет округлена до 5,
//                             Ложь - округление по арифметическим правилам
//
// Возвращаемое значение:
//  Округленное по заданному порядку значение
//
Функция ОкруглитьЦену(Число, ПараметрПорядокОкругления, ОкруглятьВБольшуюСторону) Экспорт

    Перем Результат;

    Если НЕ ЗначениеЗаполнено(Число) Тогда
        Возврат 0;
    КонецЕсли;
    
    // Преобразуем порядок округления числа.
    // Если передали пустое значение порядка, то округлим до копеек.
    Если НЕ ЗначениеЗаполнено(ПараметрПорядокОкругления) Тогда
        ПорядокОкругления = Перечисления.ПорядкиОкругления.Окр0_01;
    Иначе
        ПорядокОкругления = ПараметрПорядокОкругления;
    КонецЕсли;

    Порядок = Число(Строка(ПорядокОкругления));
        
    // вычислим количество интервалов, входящих в число
    КоличествоИнтервал    = Число / Порядок;
        
    // вычислим целое количество интервалов.
    КоличествоЦелыхИнтервалов = Цел(КоличествоИнтервал);
        
    Если КоличествоИнтервал = КоличествоЦелыхИнтервалов Тогда
        
        // Числа поделились нацело. Округлять не нужно.
        Результат    = Число;
    Иначе
        Если ОкруглятьВБольшуюСторону Тогда
            
            // При порядке округления "0.05" 0.371 должно округлитья до 0.4
            Результат = Порядок * (КоличествоЦелыхИнтервалов + 1);
        Иначе

            // При порядке округления "0.05" 0.371 должно округлитья до 0.35,
            // а 0.376 до 0.4
            Результат = Порядок * Окр(КоличествоИнтервал,0,РежимОкругления.Окр15как20);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции // ОкруглитьЦену()
16 Ёпрст
 
гуру
21.02.21
17:54
И эта шляпа была еще во всех типовых конфах в клюшках.
17 Ёпрст
 
гуру
21.02.21
17:54
там было перечисление, для определения порядка округления. и функция в глобальнике -глОкруглитьЦену
18 Ёпрст
 
гуру
21.02.21
17:57
В ут11 это в общем модуле ЦенообразованиеКлиентСервер
19 Aleksey
 
21.02.21
18:02
а что прибавить 0,5 уже не работает?
20 hhhh
 
21.02.21
18:16
(19) 0.49999999999
21 ДедМорроз
 
21.02.21
19:44
На самом деле,проблема не в том,в какую сторону округлять,а в том,что округление несимметрично.
Если мы округляем значение налога,например,а потом вычитаем его из общей суммы или сначала вычитаем,а потом округляем,то получаются разные результаты.
Округление же до ближайшего числа,кратного чему-то это вообще очень спорная операция.
22 Ненавижу 1С
 
гуру
21.02.21
19:47
(21) думаете стоит запретить?
23 Ненавижу 1С
 
гуру
21.02.21
19:48
(21) кстати, фразы начинающиеся со слов "на самом деле" не внушают доверия.
24 ДедМорроз
 
21.02.21
19:57
(23)не внушают,не читай.
25 Гений 1С
 
гуру
22.02.21
05:45
(21) мне не для бюстгалтерии нужно
26 Гений 1С
 
гуру
22.02.21
05:46
(15) мне для нетленки. Типовая функция монструозна как-то и использует преобразование строки в число