Вход | Регистрация
 

Округление в большую сторону ОкрБ(0.12, 1) = 0.2. Как максимально эффективно?

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

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


А как правильно?
   ДенисЧ
 
1 - 21.02.21 - 12:44
Если положительное, то Цел(1.12 + 1)
   RomanYS
 
2 - 21.02.21 - 12:52
Ц = Окр(Ч, Разрядность);
   Возврат Ц + ?(Ц >= Ч, 0, Pow(10, -Разрядность));
   Ненавижу 1С
 
3 - 21.02.21 - 13:44
(0) у тебя боязнь работы с отрицательными степенями?
   Ненавижу 1С
 
4 - 21.02.21 - 13:50
Функция ОкрБольш(Ч, Разрядность=0) Экспорт
    Возврат Окр(Ч+Pow(10, Разрядность)/2, Разрядность, РежимОкругления.Окр15как10);
КонецФункции
   Ненавижу 1С
 
5 - 21.02.21 - 13:52
   RomanYS
 
6 - 21.02.21 - 13:58
(4) минус похоже потерял, а так даже покрасивше
   volfy
 
7 - 21.02.21 - 13:59
+0,5 и обычное округление.
   RomanYS
 
8 - 21.02.21 - 14:04
(7) Не совсем обычное и не совсем 0,5... более менее (с одной большой ошибкой) это и предлагается в (4)
   Ненавижу 1С
 
9 - 21.02.21 - 14:05
(4) да, степень -Разрядность
   Гений 1С
 
10 - 21.02.21 - 14:22
(3) честно говоря, не помню. Проверил на калькуляторе 10 в степени -2 не равно -0.01
   Гений 1С
 
11 - 21.02.21 - 14:23
(4) проверь при параметрах (0.1, 1) даст 0.1 или 0.2?
   Ненавижу 1С
 
12 - 21.02.21 - 14:31
(11) смотри (9)
   Ненавижу 1С
 
13 - 21.02.21 - 14:38
(10) а должно быть?
   Guk
 
14 - 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 это в общем модуле ЦенообразованиеКлиентСервер
   Aleksey
 
19 - 21.02.21 - 18:02
а что прибавить 0,5 уже не работает?
   hhhh
 
20 - 21.02.21 - 18:16
(19) 0.49999999999
   ДедМорроз
 
21 - 21.02.21 - 19:44
На самом деле,проблема не в том,в какую сторону округлять,а в том,что округление несимметрично.
Если мы округляем значение налога,например,а потом вычитаем его из общей суммы или сначала вычитаем,а потом округляем,то получаются разные результаты.
Округление же до ближайшего числа,кратного чему-то это вообще очень спорная операция.
   Ненавижу 1С
 
22 - 21.02.21 - 19:47
(21) думаете стоит запретить?
   Ненавижу 1С
 
23 - 21.02.21 - 19:48
(21) кстати, фразы начинающиеся со слов "на самом деле" не внушают доверия.
   ДедМорроз
 
24 - 21.02.21 - 19:57
(23)не внушают,не читай.
   Гений 1С
 
25 - 22.02.21 - 05:45
(21) мне не для бюстгалтерии нужно
   Гений 1С
 
26 - 22.02.21 - 05:46
(15) мне для нетленки. Типовая функция монструозна как-то и использует преобразование строки в число


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.