Имя: Пароль:
1C
1С v8
Помогите написать внешнюю обработку округления на 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
> У меня с математикой совсем все туго
Это осилишь?
https://ru.wikipedia.org/wiki/Округление
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
Слава тебе, Господи!
AdBlock убивает бесплатный контент. 1Сергей