|
Помощь по округлению | ☑ | ||
---|---|---|---|---|
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"...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |