Формат числа, округление, число знаков после запятой.

Тема в разделе "1C и всё что с ней связано", создана пользователем IngWar2008, 18 апр 2008.

  1. IngWar2008

    IngWar2008 Гость

    Здравствуйте.

    подскажите как указать что переменная будет иметь только два символа после запятой, а все остальное округлять?
    не реквезит документа, а просто переменная?
    Крнечно можно сделать специальный реквизит в документе, где и обрезать лишние символы, но хотелось бы все таки узнать как сделать это с простой переменной?
     
  2. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    1. Чем не устраивает функция округления при присвоении значения переменной?
    2. Я таки не понял, вам надо округлять до определенной точности или обрезать лишние символы?
     
  3. IngWar2008

    IngWar2008 Гость

    вот к примеру
    вот этол число храниться в переменной
    Переменная = 800.304

    мне надо что оно округлялолось и имело два символа после запятой
    вот такого вида: 800.31
     
  4. Zab

    Zab Well-Known Member
    1C Team

    Регистрация:
    7 авг 2006
    Сообщения:
    583
    Симпатии:
    0
    Никак, 1С не поддерживает типизацию переменных, 7.7. точно. Правда, из нехранимых данных, типизируются колонки таблиц значений, например так:
    Код (Text):
    Переменные = СоздатьОбъект("ТаблицаЗначений");
    Переменные.НоваяКолонка("чКоличество", "Число", 6, 2);
    Переменные.НоваяСтрока();

    Переменные.чКоличество = "67абв";
    стр=0;
    Переменные.ВыбратьСтроку(стр);
    Кстати, ваш пример все равно не реализуется, т.к. при типизации значения, после присвоения 800.304 переменной с двумя знаками после запятой ее значение станет 800.30 а не 800.31.
     
  5. Isabela

    Isabela Гость

    Взять дробную часть, оставить ДВА знака, проанализировать хвост и если он больше нуля, прибавить единицу к последнему знаку дробной части...
     
  6. NomadSoul

    NomadSoul Гость

    Isabela, поддерживаю Вас.
    Добавлю, что я для подобных преобразований переводил бы число в строку, а потом обратно в число.
     
  7. Isabela

    Isabela Гость

    ну, в этом вряд ли есть необходимость - все дело просто в десятичной арифметике - задачка для пятиклассника
     
  8. NomadSoul

    NomadSoul Гость

    :rolleyes: ну да, может быть... ;)
     
  9. Sangitam

    Sangitam Well-Known Member

    Регистрация:
    4 фев 2008
    Сообщения:
    90
    Симпатии:
    0
    Переменная = Формат(выражение,"Ч12.2")
     
  10. Isabela

    Isabela Гость

    Ну, замечательно.
    прогоните код
    X = 800.304;
    XX = Format(X,"N12.2");
    Message(XX);
    и получите
    800.30 !

    Нет в 1с стандартных способов округления в бОльшую сторону, если первая отбрасываемая цифра меньше 5

    Поэтому придется не полениться и написать несколько строчек, реализующих это
     
  11. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Вот возможный пример для ленивых

    Function RoundUpToNextFractional(x,n)
    // x - число на входе
    // n - количество знаков после запятой, которое следует преобразовать так, как хотел вопрошающий

    D = 1;
    for k = 1 to n do
    D = D*10
    // увы, степени в 1с нет !
    enddo;
    xx = x*D;
    if (xx-INT(xx) > 0) AND (xx-INT(xx) < 0.5) then
    xx = Round(xx/D+1/(D-1),2,0)
    else
    xx = Round(xx/D,2,1)
    endif;
    Return xx
    endFunction
     
  12. Isabela

    Isabela Гость

    А мне вот довелось реализовывать формулу, содержащую ОТРИЦАТЕЛЬНУЮ степень в 1с
    Так я не нашла ничего лучшего, нежели притянуть макрос из Excel
    И вышло примерно так (в глобальном модуле):

    Function Degree(x,y) Export
    ExcelApp = CreateObject("Excel.Application");
    NewWorkBooks = ExcelApp.WorkBooks;
    WorkBook = NewWorkBooks.Add();
    Page = WorkBook.Worksheets(1);

    XCol = Page.Columns(1);
    YCol = Page.Columns(2);
    RCol = Page.Columns(3);
    XCell = ExcelApp.Cells(2,1);
    XCell.Value = x;

    YCell = ExcelApp.Cells(2,2);
    YCell.Value = y;
    RCell = ExcelApp.Cells(2,3);
    RCell.FormulaR1C1 = "=POWER(RC[-2],RC[-1])";

    ExcelApp.Visible = 0;

    Result = RCell.Value;
    //Message(Result);
    ExcelApp.Quit();
    Return Result;
    EndFunction

    Подскажите более изящное решение
     
  13. Silver Wind

    Silver Wind Гость

    Вообщето:
    x^y=EXP(y*LN(x))

    а в 1С8 есть
     
  14. Isabela

    Isabela Гость

    А ты пробовал, как это (x^y=EXP(y*LN(x))) будет работать в 7.7 ? Написать-то можно что угодно...
     
  15. Silver Wind

    Silver Wind Гость

    М-да, действительно, EXP() в 7.7 вообще нет, а Лог() только для положительных. Жесть. У меня раньше небходимиости ими пользоваться в 1С не возникало, но я и предположить не мог, что они отсутствуют среди стандартных функций.

    В таком случае нашлась по поиску вот такая информация - глянь, может подойдет http://www.sinor.ru/~my1c/knowhow/addmath.html.
     
  16. Flut

    Flut Гость

    А если так?

    X = Цел(Переменная * 100)/100;
    Y = Переменная - X;
    Переменная = ?(Y <> 0,Цел(Переменная*100)/100 + 0.01,Переменная);
     
  17. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Ага, для округления вверх до второго знака и это сгодится, ну а если потребуется "округлять" до 3-го, 4-го и т.п. ?
    Вроде, процедурку употребить в самый раз :)
     
  18. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    vbs
    Тогда в том, что написал Flut рекурсивно умножать и делить на 10

    ОФФ: А вообще чувствуется, что на форум начали подтягиваться Программисты, потому как большинство тем перетекает из формата криков о помощи в русло обсуждений алгоритмов и реализации оных.
     
  19. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Так, на мой взгляд, форум именно на это и ориентирован в первую очередь. Я помню первое знакомство с 1С 11 лет назад. Полдня тупо смотрел на отчет "ОстаткиТоваров", пока понял, как в принципе формируются данные (надо было вставить еще одну колонку в таблицу), так что начинающему (даже и с опытом программирования в иных средах) стоит пару-тройку месяцев поразбираться самостоятельно, обложившись стопкой ЖКК. Действительно, многие "крики о помощи" вызывают снисходительную улыбку. Без многомесячной кропотливой работы, увы, не обойтись !
     
Загрузка...

Поделиться этой страницей