К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Округлить вверх до 50 руб. Как?

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



Гость
1 - 11.06.2014 - 11:10
Понял как:

ЗарплатаО = Цел(Зарплата/50)+50;
2 - 11.06.2014 - 11:59
Фунукция ОкруглитьВверхДо50руб(Зарплата)
ЗарплатаО = Окр(Зарплата,-2,1);
Возврат ЗарплатаО+?(Зарплата>ЗарплатаО,50,0);
КонецФункции
3 - 11.06.2014 - 12:13
(1) Для 22801 результат будет 506. Если уж идти этим путем, то надо так:

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

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

ЗарплатаО = Окр(Зарплата*2+49,-2,1)/2;
4 - 11.06.2014 - 12:27
(3)
думать лень)) просто посыл к тому, что (1) не туда)
долго в табло тренировался?))
5 - 11.06.2014 - 12:49
(4) Долго. Но не в табло. И вообще не в 1С. Когла-то давно пришлось решать задачу расчета сбора за почтовый перевод фиксированым процентом "с полного и неполного рубля". Вот с тех пор и запомнился прием с Окр(...+0.49)
Гость
6 - 11.06.2014 - 12:52
0-US1C > Стыдно не знать и не читать классику.

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

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

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

– Обычным.

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

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

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

– Хорошо.

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

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

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

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

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

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

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

http://www.e-reading.ws/bookreader.p...spoved%27.html
7 - 11.06.2014 - 13:40
эх, молодёжь... [кряхтя]
не гоняли вас на упрощение алгоритмов...

проще всего работать с удвоенным числом, а результат разделить пополам:
=ОКРУГЛВВЕРХ(A1*2;-2)/2
8 - 11.06.2014 - 14:05
(7) А в какой версии есть функция ОКРУГЛВВЕРХ()?
9 - 11.06.2014 - 14:10
(8) есть Цел +1 :)
Гость
10 - 11.06.2014 - 14:45
9-Гена > Цел(50*2;-2)+1 = 101 :)
11 - 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);
КонецЕсли;

КонецЕсли;

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


К списку вопросов






Copyright ©, Все права защищены