Имя: Пароль:
1C
 
Помощь по округлению
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
На языке запросов

&НаКлиенте
Процедура Проверить(Команда)
    
    СообщитьВариант(-20, -20);
    СообщитьВариант(-19, -15);
    СообщитьВариант(-11, -10);
    СообщитьВариант(-4, 0);
    СообщитьВариант(-1, 0);
    СообщитьВариант(-0, -0);
    СообщитьВариант(1, 5);
    СообщитьВариант(4, 5);
    СообщитьВариант(5, 5);
    СообщитьВариант(6, 10);
    СообщитьВариант(9, 10);
    СообщитьВариант(10, 10);
    
КонецПроцедуры

&НаСервере
Процедура СообщитьВариант(ОкругляемоеЧисло, ПравильноеЧисло)
    
    ТекстЗапроса =
    "ВЫБРАТЬ
    |    ЦЕЛ(&ОкругляемоеЧисло / 5 + ВЫБОР
    |            КОГДА &ОкругляемоеЧисло < 0
    |                ТОГДА 0
    |            ИНАЧЕ 0.999999
    |        КОНЕЦ) * 5 КАК ОкругленноеЧисло";
    
    Запрос = Новый Запрос(ТекстЗапроса);
    Запрос.УстановитьПараметр("ОкругляемоеЧисло", ОкругляемоеЧисло);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    ОкругленноеЧисло = Выборка.ОкругленноеЧисло;
    
    Если ОкругленноеЧисло = ПравильноеЧисло Тогда
        Сообщить(СтрШаблон("%1 верно", ОкругляемоеЧисло));
    Иначе
        Сообщить(СтрШаблон("%1 НЕверно", ОкругляемоеЧисло));
    КонецЕсли;
    
КонецПроцедуры
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"...
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn