Убрать знаки после запятой в 1с

Обновлено: 05.07.2024

Округление результатов арифметических операций в запросах

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Если в операции деления заранее известны порядки числителя и знаменателя, то следует по возможности избегать выполнения деления числа заведомого маленького порядка на число заведомо большого порядка. Например, вместо:

0.02 / 28346 * 9287492

0.02 * 9287492 / 28346

2. При выполнении арифметических операций в запросах к базе данных платформа 1С:Предприятия поддерживает точность вычислений до 8 разрядов дробной части. Однако, из-за особенностей работы различных СУБД в некоторых ситуациях точность результатов может отличаться от 8. Более подробно о вычислении разрядности результатов можно почитать в статье ИТС Разрядность результатов выражений и агрегатных функций в языке запросов.

Если точность результата выполнения запроса к базе данных, содержащего

  • арифметические операции деления,
  • агрегатные функции СРЕДНЕЕ ,
  • арифметические операции умножения, если каждый из множителей может иметь дробную часть,

различается на различных СУБД, то рекомендуется к операндам и/ или результатам этих операций применять оператор явного приведения разрядности и точности числовых данных:

ВЫРАЗИТЬ(. КАК Число(m, n))

Оператор ВЫРАЗИТЬ следует применять к операндам, если на какой-нибудь СУБД точность получаемого результата недостаточна. Например, требуется 10 разрядов после запятой, а получается 6.

При этом указанная общая разрядность операндов должна быть минимальной, но не меньше той, которая достаточна для представления значений каждого из операндов. Неоправданное завышение разрядности может привести к потере точности последующих вычислений и несколько снизить скорость выполнения запроса.

Важно иметь в виду, что на разных СУБД имеются различные ограничения на максимальную разрядность десятичных чисел. Самое жесткое ограничение - это 31 разряд в целой и дробной частях. Чем меньшее значение разрядности будет указано для операндов, тем выше сможет быть точность результата. Например, если в результате требуется не менее 10 разрядов дробной части, первый операнд заведомо помещается в 15 разрядов целой части, а второй операнд заведомо помещается в 5 знаков целой части, то выражение может быть записано так:

ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Результат
ИЗ Таблица КАК Таблица

Оператор ВЫРАЗИТЬ следует применять к результату, если точность вычислений на всех СУБД достаточна, но на некоторых она больше, а на других меньше. При этом указанная общая разрядность результата должна быть минимальной, но не меньше той, которая достаточна для представления значений результата. Если в приведенном примере известно, что Знаменатель не может быть меньше 0.00001, то для представления результата достаточно 20 разрядов целой части. В этом случае выражение может быть записано так:

ВЫБРАТЬ
ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель / Таблица.Знаменатель КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица

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

ВЫБРАТЬ
ВЫРАЗИТЬ(ВЫРАЗИТЬ(Таблица.Множитель * Таблица.Числитель КАК Число(25,10)) / ВЫРАЗИТЬ(Таблица.Знаменатель КАК Число(15,10)) КАК Число(30,10)) КАК Результат
ИЗ Таблица КАК Таблица

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

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Количество знаков после запятой у Заголовка
Сцществует следующая проблема. На форме создан Заголовок "СуммаНДС". Как сделать так, чтобы чисел.

Добавить числа после запятой
Надо добавить 3числа после зяпятой .помогите Процедура Печать1(ТабДок, Ссылка) Экспорт.


Округление числа до 2 знаков после запятой
Буду очень признательна, если кто-то подскажет, как написать программу, округляющую число до двух.


Округление числа до 4 знаков после запятой
При табуляции как сделать при Y, чтобы после запятой было 4 знака?

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

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

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

подскажите как указать что переменная будет иметь только два символа после запятой, а все остальное округлять?

Никак, 1С не поддерживает типизацию переменных, 7.7. точно. Правда, из нехранимых данных, типизируются колонки таблиц значений, например так:

Кстати, ваш пример все равно не реализуется, т.к. при типизации значения, после присвоения 800.304 переменной с двумя знаками после запятой ее значение станет 800.30 а не 800.31. Взять дробную часть, оставить ДВА знака, проанализировать хвост и если он больше нуля, прибавить единицу к последнему знаку дробной части. Isabela, поддерживаю Вас.
Добавлю, что я для подобных преобразований переводил бы число в строку, а потом обратно в число. ну, в этом вряд ли есть необходимость - все дело просто в десятичной арифметике - задачка для пятиклассника

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

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

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

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

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

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

В Экселе это удаляется легким шаблоном найти и заменить: ",*" - удалится запятая и все после нее. Как сделать то же самое в .replace ?

Какой символ в "регулярных" выражениях заменяет * на "все что после"?
Либо как указать в том же реплейсе, чтобы удалялось несколько любых символов, например 2 после запятой и включая запятую?

2,027 1 1 золотой знак 21 21 серебряный знак 39 39 бронзовых знаков


942 3 3 золотых знака 9 9 серебряных знаков 22 22 бронзовых знака

Мне помог такой код .split(",")[0]

Как я понял делит строку на две части, и возвращает первый кусок до запятой т.е. [0] . Но вопрос открытый как это сделать в replace :)


942 3 3 золотых знака 9 9 серебряных знаков 22 22 бронзовых знака Интересны новые знания - а так конечно не знаю "зачем" и "чем лучше".

Если задача состоит именно в удалении первой запятой и всего что после нее, вот это сработает:

Regexp для вашей задачи - наверняка перебор.

9,596 4 4 золотых знака 19 19 серебряных знаков 35 35 бронзовых знаков Скажите пожалуйста а почему перебор? Они слишком сложные для понимания новичку или грузят систему? Хотелось бы просто знать этот грааль аналог звездочки * в экселе :) Сложные, вы, например, не смогли сходу его написать, кто-то другой может не понять. А в терминах "найти символ и отрезать все после" вы прекрасно описали задачу сами, осталась реализация. Код для работы с regexp внутри огромен и требует времени на исполнение. Ну и зачем делать сложно, если можно просто? Спасибо работает, скажите а почему у вас после print нету скобок () - видел такое в видео уроках. У меня такое на винде и в линуксе не прокатывает. Это зависит от версии питона или каких то настроек? @Amaroc, да, я по привычке для второго код пишу, в третей версии требуются скобки. к моему коду почему то не пристыковался ваш вариант. А вот с split все ок. Пример такой: money.replace("\xa0" , "").split(",")[0] - тут я еще удаляю некие пробелы в цифрах, а потом уже запятые.

Подключаем модуль для работы с регулярными выражениями:

Регулярку задаём без открывающего и закрывающего слеша, но с r перед строкой. Второй аргумент - строка (не регулярка!), которой заменить. Данная регулярка отсечёт все цифры после запятой, вместе с ней. Другие символы будут проигнорированы, однако для работы со строковыми представлениями чисел этого достаточно.

А .replace , теперь (не знаю, как раньше), не работает с регулярными выражениями, - только с простыми строками.

Подробнее про модуль re тут.

2,027 1 1 золотой знак 21 21 серебряный знак 39 39 бронзовых знаков вопрос просит удалить все символы, а не только цифры ( \d ) после запятой. @jfs в начале вопроса очень чётко указаны исходные данные: есть число. В числе никаких других символов, кроме цифр, после запятой быть не может, иначе это уже строка.

Если имеется число в строковом представлении формата "12345.123", то чтобы отбросить цифры после запятой, достаточно int(float("12345.123")) = 12345


Вопрос поставлен так, что требуется преобразовать число

Воспользуйтесь floor() из модуля math.

19.1k 28 28 золотых знаков 40 40 серебряных знаков 133 133 бронзовых знака спасибо но речь не об округлении (как я понял), а именно о приведении данных в тот вид который подойдет как для экселя так и для гугл спредшится (на сколько помню один кушает запятые а другой точки - что не может не раздражать), поэтому по привычки от запятых и точек в "деньгах" стараюсь избавлятся. Это в частном случае - а в общем интересно узнать именно спецсимвол который обозначает "всё после этого" в экселе это *, а в питоне? @Amaroc: math.floor(f) не округляет. Эта функция возвращает наибольшее целое число меньше либо равное f (отличается от int(f) ). Это было бы возможным ответом, если бы на входе у вас были числа с плавающей точкой, а не строки.

Чтобы удалить все символы после первой запятой, включая саму запятую, из строки:

Все(!) ответы, приведённые на данный момент, кроме s.split(',', 1)[0] не справляются с этой простой задачей, например:

s[:s.find(',')] может молча вернуть неправильный ответ, если в строке нет запятых. Правильное решение должно обрабатывать случай s.find(',') == -1 , то есть когда ',' not in s :

re.sub(r',\d+', '', MyString) удаляет запятые, которыми следуют цифры, оставляя все остальные символы. Чтобы удалить все символы после запятой, используя регулярное выражение:

то есть аналогом ",*" шаблона является ',.*' регулярное выражение.

Чтобы удалить произвольную пунктуацию, можно использовать r"\p+" regex: Как найти символы из кортежа ('!',',','?') в строке и удалить их?

Если входные данные в Excel, то следует убедиться что числа с плавающей точкой экспортируются в csv, используя точку, а не запятую в качестве разделителя — это может помочь правильно округлить результат, если данные рассматриваются как числа, а не строки. Или можно использовать библиотеки, которые позволяют работать с Еxcel файлами (например: xlrd , openpyxl ) или самим Excel напрямую.

Читайте также: