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

  • Автор темы IngWar2008
  • Дата начала
I

IngWar2008

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

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

vitfil

1. Чем не устраивает функция округления при присвоении значения переменной?
2. Я таки не понял, вам надо округлять до определенной точности или обрезать лишние символы?
 
I

IngWar2008

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

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

Zab

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

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

Isabela

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

NomadSoul

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

Isabela

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

Sangitam

Переменная = Формат(выражение,"Ч12.2")
 
I

Isabela

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

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

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

vbs

Вот возможный пример для ленивых

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
 
I

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

Подскажите более изящное решение
 
S

Silver Wind

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

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

а в 1С8 есть
Pow (Pow)
Синтаксис:
Pow(<Основание>, <Показатель>)
Параметры:
<Основание> (обязательный)
Тип: Число. Основание операции возведения в степень.
<Показатель> (обязательный)
Тип: Число. Показатель степени.
Возвращаемое значение:
Тип: Число. Результат возведения в степень.
Описание:
Возводит число <X> в степень <Y>.
 
I

Isabela

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

Silver Wind

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

В таком случае нашлась по поиску вот такая информация - глянь, может подойдет .
 
F

Flut

А если так?

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

vbs

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

vitfil

vbs
Тогда в том, что написал Flut рекурсивно умножать и делить на 10

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

vbs

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!