8.х Округление в 1С

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем girl-friend, 19 апр 2010.

  1. TopicStarter Overlay
    girl-friend
    Offline

    girl-friend

    Регистрация:
    23 мар 2010
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    Подскажите есть ли аналог функции экселя ОКРВВЕРХ для 1С?
    Если нет тот как это можно реализовать
  2. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Синтаксис-помощник в помощь:
  3. TopicStarter Overlay
    girl-friend
    Offline

    girl-friend

    Регистрация:
    23 мар 2010
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    при округлении в экселе 1,35=2 ; 95,41=96 (те ОКРВВЕРХ(1,35, 1)=2)
    как сделать это в 1с?
  4. TopicStarter Overlay
    girl-friend
    Offline

    girl-friend

    Регистрация:
    23 мар 2010
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    при использовании в 1с окр(51077,23397 , -1, 1) = 51080
    а в эксель ОКРВВЕРХ (51077,23397 ; 1)= 51078
    Подскажите что не так? как правильно округлить чтобы получить 51078 в 1с?
  5. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Второй параметр задали так - вот он вам и выдал 80 в конце. Внимательно прочитайте СП
  6. TopicStarter Overlay
    girl-friend
    Offline

    girl-friend

    Регистрация:
    23 мар 2010
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    1
    извиняюсь, теперь так, при использовании в 1с окр(51077,23397 , 0, 1) = 51077
    а в эксель ОКРВВЕРХ (51077,23397 ; 1)= 51078
    всё равно результат не 51078, почему?
  7. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.638
    Симпатии:
    948
    Баллы:
    204
    Напишите вот так

    Код:
    Сообщить(окр(Округление+0.5 , 0, 1));
    
    Где Округление -число которое надо округлить например 51077,23397
  8. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Ну чтобы окончательно закрыть тему, еще бы написал универсальную функцию, а не только округление до целого :)
  9. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Код:
    окр(Округление+(0.5/ВозведениеВСтепень(10, разрядность)) , разрядность, 1)
    
    
    
  10. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    ВозведениеВСтепень - нет такой встроеной. Может просто "pow"??
    Вот так хорошо:
    Код:
    Функция ОкруглитьВверх(Число, Разрядность = 0, Окр15Как20 = 1)
    Возврат(Окр(Число+(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20))
    КонецФункции
    
    
    Почти хорошо :) Вот только если "Разрядность" превышает разряд числа в целую или в дробную сторону - выводит неверно.
    Думаю, стоит изменить подход и использовать встроенную функцию Цел().
    Работаем дальше, коллеги :)

    Вложения:

  11. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Похоже, это моя вечная беда - вместо того, чтобы найти уже написанную умными людьми функцию, я пишу её сам. С колледжа осталось - именно так меня палили, что я не читал теоретический материал: всё работало, притом правильно, но код поражал воображение.

    Можно и "Цел". Пожалуй, формула будет выглядеть как-то так.

    Код:
    Функция ОкруглитьВверх(Число, Разрядность = 0, Окр15Как20 = 1)
    Возврат((Цел(Число*pow(10, Разрядность))+1)/pow(10, Разрядность));
    КонецФункции
    
    
    
    Однако, если разрядность превышает (или, хотя бы, равна) разрядность числа, так же выходит косяк. Выводы? Надо проверять разрядность числа заранее.
  12. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Небольшой апдейт функции:

    Код:
    Возврат?(НЕ (Окр(Число, Разрядность) = Число),(Окр(Число+(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20)), Число);
    
  13. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Большой апдейт функции.

    Код:
    Возврат?(НЕ (Окр(Число, Разрядность) = Число),?(Найти(СокрЛП(Число), ",") - 2 > (0 - Разрядность), pow(10, 0 - Разрядность) ,(Окр(Число+(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20))), Число);
    
    
    Тестировал, косяков не нашёл. Предлагаю покритиковать.

    Вложения:

  14. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Критикую.
    Число
    123, 123;
    разрядность
    -4
    Должно округлить как 1000, а округляет как 10000, ну и далее, если -5, то 100000
    :)

    Вопросик в тему. Кто как считает, -123,4 в бОльшую сторону округлить это -123 или -124? :)
  15. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Да нет, тут всё правильно с данной точки зрения - число "1" - это разрядность "0". Потому разрядность "-1" - 10, а "-4" - 10000.

    Но косяки, кое-какие, всё же, нашёл. Например, надо будет учесть отрицательные числа. Кстати, у них округление в большую сторону, это, как раз, стремление к нулю, если моя память не спит с другим.
  16. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Пожалуй, с количеством разрядов до запятой надо по-химичить. Работает вкривь и вкось - сильно зависит от числа, которое введено. Я пока займусь работой - потом уже, в свободное время, подумаю над этим.
  17. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Ну тут в принципе смотря с какой стороны посмотреть... В моей обработке ниже округляет по "моему" правилу :) Эксель, кстати, вообще ноль выдает.
    Эксель округляет -123,5 как -124. ОКРВВЕРХ отрицательных чисел эксель не считает.
    Предлагаю свою функцию:
    Код:
    Функция ОкруглитьВверх(Число, ПорядокОкругления = 0) Экспорт
    
    Отрицательное = ЛОЖЬ;
    Если Число = 0 Тогда //Ноль округлять не будем
    Возврат 0;
    ИначеЕсли Число < 0 Тогда
    //Отрицательные числа будем округлять по модулю.
    Число = -Число;
    Отрицательное = Истина;
    КонецЕсли;
    
    Порядок            = 1/pow(10,ПорядокОкругления);
    
    // вычислим количество интервалов, входящих в число	
    КолвоИнтервал    = Число / Порядок;
    
    // вычислим целое количество интервалов.	
    КолвоИнтервалЦел= Цел(КолвоИнтервал);
    Если КолвоИнтервалЦел = 0 Тогда
    //Превышение разрядности на целых. 
    //Получим количество Разрядов исходного числа
    КоличествоРазрядовЦелойЧасти = Цел(log10(Число)+1);
    
    Результат = Окр((Число+0.5*pow(10,КоличествоРазрядовЦелойЧасти)),-КоличествоРазрядовЦелойЧасти);	
    ИначеЕсли КолвоИнтервал = КолвоИнтервалЦел Тогда
    // Числа поделились нацело. Округлять не нужно.
    Результат    = Число;
    Иначе
    Результат    = Порядок * (КолвоИнтервалЦел + 1);
    КонецЕсли;
    Если Отрицательное Тогда
    Результат = -Результат;	
    КонецЕсли;
    Возврат Результат;
    КонецФункции 
    
    Частично украдено с http://www.forum.mista.ru/topic.php?id=82428
    Громоздко, но вродь работает, отрицательные - в бОльшую сторону по абсолютной величине.

    Вложения:

  18. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Действительно, громоздко. Есть вариация, которая гораздо меньше размерами, да и все правила округления оставляет на совести 1С.

    Код:
    Возврат?(Число < 0, ?(НЕ (Окр(Число, Разрядность) = Число),(Окр(Число-(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20)), Число),?(НЕ (Окр(Число, Разрядность) = Число),(Окр(Число+(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20)), Число));
    

    Вложения:

  19. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    ОФФТОП:
    Я фигею :))))))
    Послежу за веткой, ибо таких алгоритмов округления никогда не использовал :)
  20. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Ну раз следите, чуть улучшенная версия предыдущей функции.

    Код:
    Возврат ?(НЕ (Окр(Число, Разрядность) = Число),?(Число < 0, (Окр(Число-(0.5/pow(10, Разрядность)) , Разрядность, Окр15Как20)),(Окр(Число+(0.5/pow(10, Разрядность)), Разрядность, Окр15Как20))), Число);
    

    Вложения:

Поделиться этой страницей