|
Помогите написать внешнюю обработку округления на 1С 8.3 | ☑ | ||
---|---|---|---|---|
0
Inshi
11.10.18
✎
21:15
|
Помогите написать алгоритм округления (внешняя обработка).
Задача: Вводится число, которое нужно округлить (пример: 250.35941). Вводится число на сколько цифер после запятой остается(пример: Цифры после запятой - 2; Результат - 250.35). Примечание: я уже реализовал используя тип: Строка; но мне нужно реализовать используя тип: Число. Прошу помочь мне. Я начинающий разработчик. ВСТРОЕННУЮ ФУНКЦИЮ ОКР() Я ИСПОЛЬЗОВАЛ, НО МНЕ ОНА НЕ ДАЕТ НУЖНОГО РЕЗУЛЬТАТА. |
|||
1
Amra
11.10.18
✎
21:18
|
То есть требуется не округление, а просто оставить энное количество знаков после запятой? И да, не капси тут
|
|||
3
Inshi
11.10.18
✎
21:23
|
(1) Amra, прошу прощения. Нет, требуется округлить число. Я просто немного не понимаю, через что мне лучше всего сделать. Через Дроб()?
|
|||
6
Amra
11.10.18
✎
21:26
|
(3) Определись что надо. Округление 250.35941 по правилам математики дает 250.36, а не 250.35. И показывай, как использовал Окр(), что она не дала правильно регультата
|
|||
7
Inshi
11.10.18
✎
21:31
|
(6) Она выполняет все казалось бы нормально, но вот только у меня есть еще неких 3 режима( "Вверх" - число постоянно округляется в большую сторону, если X > 0; "Нет" - Просто выполняется округление, по правилам математики; "Вниз" - выполняет все тоже самое, что и "Нет") все это выбирается через СписокЗначений. У меня уже есть вариант в котором я выполнил это все, но там работа идет с преобразованием числа в строку и после все манипуляций переводиться снова в число и выводиться.
|
|||
8
Inshi
11.10.18
✎
21:33
|
(6)Я знаю как работает встроенная функция Окр(Округляемое число,Округление До,Режим округления(0,1))
|
|||
9
Dен
11.10.18
✎
21:36
|
||||
10
Inshi
11.10.18
✎
21:49
|
(9)Я все понимаю... Но я не на столько тупой. Раз я пишу сюда, так может это значит, что у меня проблемы конкретно с реализацией этого в 1С...
|
|||
11
Мимохожий Однако
11.10.18
✎
21:51
|
Используй Формат(ТвоёЧисло,"ЧДЦ=2")
|
|||
12
Злопчинский
11.10.18
✎
21:55
|
в формат надо ввести новую форматную строку - ПДЦ
|
|||
13
bolder
11.10.18
✎
21:55
|
(10) То что ты просишь не есть округление , это отсечение.
Цел(x*100)/100; |
|||
14
Мимохожий Однако
11.10.18
✎
21:57
|
(12) Согласен
|
|||
15
probably
11.10.18
✎
22:04
|
(10) без обид, приводи ка как задача решена тобой на паскале (или какой язык ты знаешь) и получишь ответ как сделать в 1с
|
|||
16
Inshi
11.10.18
✎
22:25
|
<pre>
перем СписВыб; Процедура КнопкаВыполнитьНажатие(Кнопка) // Вставить содержимое обработчика. КонецПроцедуры Процедура ОкруглитьНажатие(Элемент) Если ОкруглитьДо >= 5 Тогда//Условие при котором мы устранили ошибку РезультатОкр = ОкрЧисло; Возврат; КонецЕсли; ОЧ = Строка(ОкрЧисло);//Преобразовали ОкрЧисло в строку из числа Позиция = Найти(ОЧ,",");//Находим запятую в числе ВременноеЗначение = Число(Лев(ОЧ,Позиция + ОкруглитьДо));//Оставляем определенное количество знаков после запятой. Преобразуем результат функции ЛЕВ() в число КонтрЧис = Число(Сред(ОЧ,Позиция + ОкруглитьДо + 1,1));//Нашел число при помощи которого буду производить округление //----------------------------------------------------------------- //Если РежимОкр = 2 Тогда // если КонтрЧис >= 5 Тогда // ВременноеЗначение = ВременноеЗначение + Прибавить; // КонецЕсли; //ИначеЕсли РежимОкр = 0 Тогда // //ИначеЕсли РежимОкр = 1 Тогда // если КонтрЧис >= 0 Тогда // ВременноеЗначение = ВременноеЗначение + Прибавить; // КонецЕсли; //КонецЕсли; //----------------------------------------------------------------- Если РежимОкр = 2 И КонтрЧис >= 5 Или РежимОкр = 1 И КонтрЧис >= 0 Тогда Прибавить = 1; Для сч = 1 по ОкруглитьДо цикл Прибавить = Прибавить / 10; КонецЦикла; ВременноеЗначение = ВременноеЗначение + Прибавить; КонецЕсли; //----------------------------------------------------------------- РезультатОкр = ВременноеЗначение; КонецПроцедуры Процедура ОкрЧислоПриИзменении(Элемент) РежимОкр = Перечисления.РежимыОкругления; СписВыб = Новый СписокЗначений; СписВыб.Добавить(1, "Вверх"); СписВыб.Добавить(2 , "Нет" ); СписВыб.Добавить(0, "Вниз" ); ЭлементыФормы.РежимОкр.СписокВыбора = СписВыб; Режимокр = 2; КонецПроцедуры </pre> |
|||
17
Inshi
11.10.18
✎
22:26
|
(15) Представил код, в котором я решил данную задачу при помощи преобразования в строку
|
|||
18
Fram
12.10.18
✎
02:07
|
(17) играйся с функцией ОКР(), а также с операциями умножения и деления пока не поймёшь как все это работает.
|
|||
19
Inshi
12.10.18
✎
19:06
|
(18) (15) (13) (12) (11) (6)
Я нашел решение! Вернее я сам его и написал) перем СписВыб; Процедура КнопкаВыполнитьНажатие(Кнопка) // Вставить содержимое обработчика. КонецПроцедуры Процедура ОкруглитьНажатие(Элемент) Если ОкруглитьДо >= 5 Тогда//Условие при котором мы устранили ошибку РезультатОкр = ОкрЧисло; Возврат; КонецЕсли; Прибавить = 1; Для сч = 1 по ОкруглитьДо цикл Прибавить = Прибавить * 10; КонецЦикла; ВЗ = ОкрЧисло * Прибавить;//вывожу часть с которой в последующем буду работать Цел1 = Цел(ВЗ);//Перевод числа в целый Тест = Цел1 / Прибавить;//Возвращаю цифры после запятой ВЗ2 = ОкрЧисло * Прибавить * 10;// Цел2 = Цел(ВЗ2);// КонтрЧис = Цел2 - (Цел1 * 10);// //----------------------------------------------------------------- Если РежимОкр = 2 И КонтрЧис >= 5 Или РежимОкр = 1 И КонтрЧис >= 0 Тогда Прибавить = 1; Для сч = 1 по ОкруглитьДо цикл Прибавить = Прибавить / 10; КонецЦикла; Тест = Тест + Прибавить; КонецЕсли; //----------------------------------------------------------------- РезультатОкр = Тест; КонецПроцедуры Процедура ОкрЧислоПриИзменении(Элемент) РежимОкр = Перечисления.РежимыОкругления; СписВыб = Новый СписокЗначений; СписВыб.Добавить(1, "Вверх"); СписВыб.Добавить(2 , "Нет" ); СписВыб.Добавить(0, "Вниз" ); ЭлементыФормы.РежимОкр.СписокВыбора = СписВыб; Режимокр = 2; КонецПроцедуры |
|||
20
Мимохожий Однако
12.10.18
✎
19:47
|
Слава тебе, Господи!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |