|   |   | 
| 
 | Помощь по округлению | ☑ | ||
|---|---|---|---|---|
| 0
    
        user4fun 08.02.24✎ 23:10 | 
        Всем здравствуйте, помогите написать код для округления суммы всегда в большую сторону кратную 5-ти, к примеру: 126 = 130, 41 = 45, 57 = 60, 12 = 15. 10 = 10, 15 = 15 Всем спасибо за ответы.     | |||
| 1
    
        Злопчинский 08.02.24✎ 23:28 | 
        ну, показывай код, который у тебя получился...     | |||
| 2
    
        Злопчинский 08.02.24✎ 23:28 | 
        как вариант - посмотреть в типовых/БСП, там стопудово есть что-то похожее     | |||
| 3
    
        Garykom гуру 08.02.24✎ 23:28 | 
        ОстатокОтДеленияНа5 = ИсходноеЧисло % 5;
 ОкругленноеДо5ВБольшую = ?(ОстатокОтДеленияНа5 = 0, ИсходноеЧисло, ИсходноеЧисло+5-ОстатокОтДеленияНа5); | |||
| 4
    
        PR 09.02.24✎ 01:04 | 
        Для нуля знаков после запятой будет ЦЕЛ(Сумма/5+0,9)*5
 Для двух знаков после запятой будет ЦЕЛ(Сумма/5+0,999)*5 Вариант для двух знаков подойдет и для нуля, но не наоборот | |||
| 5
    
        Гена гуру 09.02.24✎ 09:15 | 
        (4) Офф. Тоже ждёте трансляции? )
 https://i.ibb.co/fDGkxYv/photo-2024-02-09-09-42-16.jpg По теме. Такие округления как правило нужны для денег: цены или индексированные зарплаты, т.е. число положительное и не больше лимона, поэтому для эпсилона хватит одной миллиардной. А = (Цел(А/5,000000000001)+1)*5 | |||
| 6
    
        PR 09.02.24✎ 01:17 | 
        (5) Офф. Да не, завтра посмотрю в обычном режиме, то есть сегодня уже
 Просто работаю, базу причесываю немного Это у Запада "Колечко, сжималось колечко...", а нам-то что По теме Мой вариант математически верен, а твой как-то сомнителен Кроме того, в курсе ли ты, например, что в запросе точность деления скулем максимум 6 знаков? | |||
| 7
    
        Garykom гуру 09.02.24✎ 01:37 | 
        (4) (5) Эмм.
 10 = 10 должно быть, и 5 = 5 Проверьте по своим формулам... | |||
| 8
    
        PR 09.02.24✎ 01:40 | 
        (7) Так 10 и 5 и будет     | |||
| 9
    
        Garykom гуру 09.02.24✎ 01:47 | 
        (8) Да, ошибся
 Но мучают меня подозрения, при некоторых условиях могут быть проблемы с подобной чисто математической формулой | |||
| 10
    
        Garykom гуру 09.02.24✎ 01:49 | 
        И не уверен что легко переделать на другое подобное округление
 Например если надо кратно 25 в большую делать | |||
| 11
    
        Garykom гуру 09.02.24✎ 01:50 | 
        -10 или -5 у вас что получится?     | |||
| 12
    
        PR 09.02.24✎ 01:50 | 
        (9) Не мучайся, все верно
 +0.999 — это +1, то есть по сути +5 после умножения, для округления в верхнюю сторону И потом минус число, меньше самого маленького, то есть -0.001, если мы про два знака после запятой, чтобы учесть случаи типа 5, 10, 15 и пр. | |||
| 13
    
        PR 09.02.24✎ 01:51 | 
        (10) Вместо 5 напиши 25 и все     | |||
| 14
    
        PR 09.02.24✎ 01:52 | 
        (11) -10 и -5     | |||
| 15
    
        PR 09.02.24✎ 01:53 | 
        Для -11 будет -10, все четко     | |||
| 16
    
        Garykom гуру 09.02.24✎ 01:56 | 
        (14) ЦЕЛ(-5/5+0,9)*5 = ЦЕЛ(-1+0,9)*5 = ЦЕЛ(-0,1)*5 = 0*5 = 0
 -5 -> 0 ??? | |||
| 17
    
        PR 09.02.24✎ 02:01 | 
        (16) А, проверял в Экселе
 А Целое в Экселе не равно Цел в 1С Нужно посмотреть будет завтра, да | |||
| 18
    
        trad 09.02.24✎ 07:30 | 
        (0)
 v7: Окр(Сумма/5+0.5, 0, 0)*5 v8: Окр(Сумма/5+0.5, 0, РежимОкругления.Окр15как10)*5 | |||
| 19
    
        Ненавижу 1С гуру 09.02.24✎ 08:12 | 
        Функция ОкруглениеВВерх(Значение, Точность=1) Экспорт
 Если Точность<>1 Тогда Возврат ОкруглениеВВерх(Значение/Точность)*Точность; КонецЕсли; ЦелоеБольше = Цел(Значение)+1; Возврат ЦелоеБольше - Цел(ЦелоеБольше-Значение); КонецФункции | |||
| 20
    
        user4fun 09.02.24✎ 08:46 | 
        Всем огромное спасибо за ответы! (19) (18) (17) (16)     | |||
| 21
    
        Гена гуру 09.02.24✎ 09:19 | 
        (4) Согласен, для денежных чисел (копейки) сработает Ваша красивая формула: 
 А = ЦЕЛ(А/5+0.999)*5 | |||
| 22
    
        Ненавижу 1С гуру 09.02.24✎ 09:23 | 
        (21) а мне принципиально не нравятся вот эти вот 0.999
 потому что надо закладываться на точность и изменять эту константу при изменении точности. Не универсально | |||
| 23
    
        Гена гуру 09.02.24✎ 09:43 | 
        (22) Зачем создавать универсальный автомобиль-самолёт-амфибию, если нужно только ездить? 
 Округление до 5 рублей стандартное требование в денежных расчётах. Никто не ставит оклад в 49567.32 Поэтому если округление именно денежных сумм, то формула PR получает 1-ый приз ) | |||
| 24
    
        Ненавижу 1С гуру 09.02.24✎ 09:45 | 
        (23) Я понимаю ваше мнение, оно имеет право на жизнь, но я останусь при своем. Удачи!     | |||
| 25
    
        Garykom гуру 09.02.24✎ 09:53 | 
        (21)     
 | |||
| 26
    
        Garykom гуру 09.02.24✎ 09:54 | 
        (21)     
 | |||
| 27
    
        Гена гуру 09.02.24✎ 09:54 | 
        (25) Дубль три: оклады и цены отрицательными не бывают.     | |||
| 28
    
        Garykom гуру 09.02.24✎ 09:56 | 
        (27) "написать код для округления суммы всегда в большую сторону кратную 5-ти"
 где в (0) про оклады и цены? | |||
| 29
    
        Ненавижу 1С гуру 09.02.24✎ 09:57 | 
        (27) видите как резко ограничивается область применения. Это к вопросу, а так ли плоха универсальность     | |||
| 30
    
        Гена гуру 09.02.24✎ 09:57 | 
        (28) Так говорит Телепат 2.0
 Спорим? Автор придёт и решит ) | |||
| 31
    
        Garykom гуру 09.02.24✎ 09:57 | 
        5,5555 - округли в большую сторону до 5 ))     | |||
| 32
    
        Гена гуру 09.02.24✎ 09:59 | 
        (29) Если айфон работает в диапазоне земных температур, то не стоит изобретать универсальный гаджет для работы на Венере или Юпитере.     | |||
| 33
    
        Garykom гуру 09.02.24✎ 10:00 | 
        Хватит уже, нет лучшего варианта чем через "%"
 Только остаток от деления самый быстрый (меньшие вычислительные затраты) и правильный способ | |||
| 34
    
        Гена гуру 09.02.24✎ 10:01 | 
        (31) Вы хлеб покупаете? Видели ли когда-нибудь цену в сотых долях копеек?     | |||
| 35
    
        Garykom гуру 09.02.24✎ 10:01 | 
        (34) это цена в USD     | |||
| 36
    
        Ненавижу 1С гуру 09.02.24✎ 10:01 | 
        (32) да, во всем нужна мера, согласен. Но писать отдельно округление только для цен (положительных и не более точности 2) так себе идея     | |||
| 37
    
        Garykom гуру 09.02.24✎ 10:03 | 
        (35)+ А скидка будет отрицательной     | |||
| 38
    
        Гена гуру 09.02.24✎ 10:03 | 
        (36) Это же не отдельная функция, а просто дополнительное действие для ранее полученного результата.     | |||
| 39
    
        Гена гуру 09.02.24✎ 10:04 | 
        (35) Не придумывайте. До 5 долларов ещё никто никогда не округлял.     | |||
| 40
    
        RomanYS 09.02.24✎ 10:04 | 
        Окр(Ч/5+0.5, 0, РежимОкругления.Окр15как10)*5     | |||
| 41
    
        Ненавижу 1С гуру 09.02.24✎ 10:06 | 
        (38) что это меняет?
 (39) какой вы волатильный, право | |||
| 42
    
        Garykom гуру 09.02.24✎ 10:06 | 
        (39) Не прикидывайся
 Цена $5,5555 Округлять нужно кратно 0,0005 | |||
| 43
    
        Garykom гуру 09.02.24✎ 10:07 | 
        (42)+ в случае алгоритма (3) это легко и просто     | |||
| 44
    
        Garykom гуру 09.02.24✎ 10:12 | 
        (40)     
 | |||
| 45
    
        Гена гуру 09.02.24✎ 10:15 | 
        (43) Дубль четыре: мы не пишем универсальную функцию округления вверх до заданного делителя. Таких можно написать сотни. Нам надо быстро округлить денежную сумму до 5 рублей. Давайте отсекать лишнее )     | |||
| 46
    
        Ненавижу 1С гуру 09.02.24✎ 10:20 | 
        (45) ох уж эти быстрые разработчики, вам нужно с фиксиным профсоюз организовать     | |||
| 47
    
        Гена гуру 09.02.24✎ 10:24 | 
        (46) Угу... зато медленные разработчики готовы весь свой код заполонить универсальными нетиповыми функциями.     | |||
| 48
    
        RomanYS 09.02.24✎ 10:33 | 
        (44) Окр(Ч/5+0.5, 0, РежимОкругления["Окр15как"+?(Ч<0, 20, 10)])*5
 С остатками от деления отрицательных чисел в 1С тоже засада | |||
| 49
    
        Garykom гуру 09.02.24✎ 11:02 | Функция Округлить(Исходное, Кратность, Увеличение = Истина) ОстатокОтДеления = Исходное % Кратность; Если ОстатокОтДеления = 0 Тогда Округленное = Исходное; ИначеЕсли ОстатокОтДеления < 0 И Увеличение Тогда Округленное = Исходное - ОстатокОтДеления; ИначеЕсли ОстатокОтДеления < 0 И НЕ Увеличение Тогда Округленное = Исходное + Кратность - ОстатокОтДеления; ИначеЕсли ОстатокОтДеления > 0 И Увеличение Тогда Округленное = Исходное + Кратность - ОстатокОтДеления; ИначеЕсли ОстатокОтДеления > 0 И НЕ Увеличение Тогда Округленное = Исходное - ОстатокОтДеления; КонецЕсли; Возврат Округленное; КонецФункции | |||
| 50
    
        Garykom гуру 09.02.24✎ 11:00 | 
        (49)+ Специально написал развернуто, не стал сокращать читабельность кода     | |||
| 51
    
        Garykom гуру 09.02.24✎ 11:21 | 
        (49) хмм, Увеличение/Уменьшение можно на знак Кратность повесить     | |||
| 52
    
        Ненавижу 1С гуру 09.02.24✎ 11:25 | 
        (49) Способов окргуления чуть больше правда     | |||
| 53
    
        Гена гуру 09.02.24✎ 11:38 | 
        Раззадорили всё-таки меня изобретатели велосипедов. Ну не может такого быть, чтобы фирма 1С ограничилась только типовыми Цел и Окр )
 Глянул в Зуп и БП, но можете проверить и в других конфигурациях. Есть таки типовая Функция Округлить(Число, Точность = 0, Правило = Неопределено) Экспорт А для Правил есть отдельное перечисление ПравилаОкругленияПриРасчетеЗарплаты Не обращайте внимание на наименование, это просто для отвода глаз, что якобы только для зарплаты ) Более того, есть ещё и справочник: СпособыОкругленияПриРасчетеЗарплаты В нём уже куча всяких элементов округлений до копеек, рубля, червонца, стольника... Никто не мешает завести и настроить новый элемент "до 5 рублей" | |||
| 54
    
        Garykom гуру 09.02.24✎ 11:51 | 
        (52) Это уже кому надо пусть реализуют
 Главное что мой вариант работает и для отрицательных И для 5,555X % 0,0005 | |||
| 55
    
        PR 09.02.24✎ 12:10 | 
        (21) Важнее всего то, что она применяема в запросе     | |||
| 56
    
        PR 09.02.24✎ 12:10 | 
        (22) Используй всегда 0.999999     | |||
| 57
    
        PR 09.02.24✎ 12:11 | 
        (25) Для отрицательных да, нужно доработать     | |||
| 58
    
        Garykom гуру 09.02.24✎ 12:17 | 
        (55) остаток от деления в запросе можно, как и выбор когда тогда     | |||
| 59
    
        PR 09.02.24✎ 12:20 | 
        (58) Да можно, конечно
 Можно и временную таблицу из ТЗ подтянуть Все можно Но ты же понимаешь, что есть такой критерий, как простота Тем более, что может так получиться, что округлять понадобится тоже не поле, а нехреновое такое выражение | |||
| 60
    
        PR 09.02.24✎ 12:49 | 
        На языке запросов
 
 | |||
| 61
    
        Garykom гуру 09.02.24✎ 12:49 | 
        (59) нехреновое  такое выражение как раз проще через промежуточную ВТ     | |||
| 62
    
        trad 09.02.24✎ 12:50 | 
        чем вас (18) не устраивает?
 подходит под условия в (0) работает с отрицательными и положительными, любой точности | |||
| 63
    
        PR 09.02.24✎ 12:51 | 
        (61) Не всегда
 В (60) вариант, когда округляемое выражение упоминается лишь дважды и то, только из-за проверки на отрицательные числа | |||
| 64
    
        PR 09.02.24✎ 12:53 | 
        (62) -20 проверь     | |||
| 65
    
        Ненавижу 1С гуру 09.02.24✎ 13:06 | 
        (56) спасибо конечно, но нет     | |||
| 66
    
        trad 09.02.24✎ 13:12 | 
        (64) точно, проблема
 тогда (48) | |||
| 67
    
        Злопчинский 09.02.24✎ 13:23 | 
        так -12 куда округляем - к -10 или к -15 ...?     | |||
| 68
    
        Garykom гуру 09.02.24✎ 13:32 | 
        (66) ты хотел сказать (49) ? :)
 Даже для дробных работает правильно, не только отрицательных | |||
| 69
    
        Garykom гуру 09.02.24✎ 13:33 | 
        (67) -12 к -10, написано же к большему
 про модуль ничего нет | |||
| 70
    
        Злопчинский 09.02.24✎ 13:38 | 
        (45) ненене.. так не пойдет, я тут задачку делал, так там порядок округления - "кратно 100"...     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |