Форум на Kuban.ru (http://forums.kuban.ru/)
-   Территория 1С (http://forums.kuban.ru/f1040/)
-   -   Округлить вверх до 50 руб. Как? (http://forums.kuban.ru/f1040/okruglit-_vverh_do_50_rub_kak-5797206.html)

US1C 11.06.2014 11:04

Округлить вверх до 50 руб. Как?
 
Задача такая, надо округлить суммы выплат до 50 руб. в сторону увеличения. Т.е. чтобы, например, сумма 22801 стала 22850, или 16549 -> 16550. Никак не пойму, каким алгоритмом можно повторить функцию Excel ОКРВВЕРХ().
Есть какие-нибудь идеи?

US1C 11.06.2014 11:10

Понял как:

ЗарплатаО = Цел(Зарплата/50)+50;

user1C 11.06.2014 11:59

Фунукция ОкруглитьВверхДо50руб(Зарплата)
ЗарплатаО = Окр(Зарплата,-2,1);
Возврат ЗарплатаО+?(Зарплата>ЗарплатаО,50,0);
КонецФункции

Ткачик 11.06.2014 12:13

(1) Для 22801 результат будет 506. Если уж идти этим путем, то надо так:

ЗарплатаО = Цел(Зарплата/50)[b]*50[/b]+50;

(2) Это уж совсем по-1Совски... А по-математическому:

ЗарплатаО = Окр(Зарплата*2+49,-2,1)/2;

user1C 11.06.2014 12:27

(3)
думать лень)) просто посыл к тому, что (1) не туда)
долго в табло тренировался?))

Ткачик 11.06.2014 12:49

(4) Долго. Но не в табло. И вообще не в 1С. Когла-то давно пришлось решать задачу расчета сбора за почтовый перевод фиксированым процентом "с полного и неполного рубля". Вот с тех пор и запомнился прием с Окр(...+0.49)

DeiMos 11.06.2014 12:52

0-US1C > Стыдно не знать и не читать классику.

Про полтинники. Я уже писал, как в компании, продававшей периодическую печать, киоскеры, работавшие в метро, взмолились, чтобы мы округляли розничные цены на газеты до полтинника. Руководство нас на это благословило, и я программисту ровно так задание и сформулировал: «В поле PriceMetro поместить значение из поля PriceRetail, округленное до 0,5».

Звонит программист:

– А каким способом округлять?

– Обычным.

– Андрей, я не знаю обычного способа округлять до 0,5. Пожалуйста, опиши.

– Ты издеваешься?

– Нет, я серьезно.

– Хорошо.

Я в раздражении швыряю трубку, открываю текст задания и… задумываюсь. На всякий случай лезу в Интернет, потом благодарю Бога, что у меня есть умный и спокойный программист, и записываю в задании:

ДРОБН:= А – ЦЕЛОЕ (А)

ЕСЛИ ДРОБН < 0,25 ТО ДРОБН:= 0

ИНАЧЕ ЕСЛИ ДРОБН < 0,75 ТО ДРОБН:= 0,5

ИНАЧЕ ДРОБН:= 1

ОКРУГЛ05 (А) = ДРОБН + ЦЕЛОЕ (А)

Дело в том, что не существует никакого «общего» способа округления до полтинников. Его нужно было записать в задании явно. Что я и сделал самым понятным для программиста способом.

[url]http://www.e-reading.ws/bookreader.php/97945/Orlov_-_Zapiski_avtomatizatora._Professional%27naya_ispoved%27.html[/url]

Гена 11.06.2014 13:40

эх, молодёжь... [кряхтя]
не гоняли вас на упрощение алгоритмов...

проще всего работать с удвоенным числом, а результат разделить пополам:
=ОКРУГЛВВЕРХ(A1*2;-2)/2

Ткачик 11.06.2014 14:05

(7) А в какой версии [b]1С[/b] есть функция ОКРУГЛВВЕРХ()?

Гена 11.06.2014 14:10

(8) есть Цел +1 :)

roma n 11.06.2014 14:45

9-Гена > Цел(50*2;-2)+1 = 101 :)

Чучундер 11.06.2014 20:27

Как говорил Фиксин "..мой гений дарит вам..."
.
//******************************************************************************
// глОкруглить(Числ, ПорядокОкругления)
//
// Параметры:
// Числ - исходное число
// ПорядокОкругления - элемент перечисления Порядки окгугления:
// "шаг" округления (0.01 (арифметическое), 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50, 100)
//
// Возвращаемое значение:
// Округленное по заданному порядку значение
//
// Описание:
// Округляет число вверх по заданному порядку. Т.е число 123.37 при порядке
// округление 0.5 превратиться в 123.50, а число 0.1 при порядке округления
// 5 станет равным 5.
// Если значение перечисления ОкрТочно, то округляет арифметически до 0.01
//
Функция глОкруглить(Числ, ПорядокОкругления) Экспорт
Перем Рез;

Если ПорядокОкругления = Перечисление.ПорядкиОкругления.ОкрТочно Тогда

// арифметическое округление до 2-х знаков после запятой
Рез = Окр(Числ, 2);
Иначе
// округление к верхней границе по заданному порядку

// преобразуем порядок округления число
Порядок = Число(Строка(ПорядокОкругления));

// вычислим количество интервалов, входящих в число
КолвоИнтервал = Числ / Порядок;

// вычислим целое количество интервалов.
КолвоИнтервалЦел= Цел(КолвоИнтервал);

Если КолвоИнтервал = КолвоИнтервалЦел Тогда
// Числа поделились нацело. Округлять не нужно.
Рез = Числ;
Иначе
Рез = Порядок * (КолвоИнтервалЦел + 1);
КонецЕсли;

КонецЕсли;

Возврат Рез;
КонецФункции // глОкруглить()


Текущее время: 10:55. Часовой пояс GMT +3.