Что такое целочисленное значение для суммы платежа
Что такое целочисленное значение для суммы платежа
Об актуальных изменениях в КС узнаете, став участником программы, разработанной совместно с АО «Сбербанк-АСТ». Слушателям, успешно освоившим программу выдаются удостоверения установленного образца.
Программа разработана совместно с АО «Сбербанк-АСТ». Слушателям, успешно освоившим программу, выдаются удостоверения установленного образца.
Обзор документа
Разъяснения Банка России от 29 марта 2021 г. № 5697-U-2021/3 «Об определении показателя «P» (сумма процентов в денежном выражении) при расчете ПСВ в случае, если показатель «Р» принимает дробное или нулевое значение»
С учетом норм абзаца пятого пункта 4 Указания Банка России N 5697-У об округлении дробного значения показателя «P» формулы расчета ПСВ по математическим правилам до целого числа в случае, если значение суммы процентов в денежном выражении имеет несколько десятичных знаков после запятой, то оно подлежит округлению до целого числа.
В случае, когда по результатам округления в соответствии с указанным порядком показатель «Р» принимает нулевое значение, для целей расчета ПСВ в соответствии с установленной пунктом 4 Указания Банка России N 5697-У формулой расчета ПСВ рекомендуется применять округление значения «P» по математическим правилам до двух десятичных знаков после запятой.
Обзор документа
Относительно округления дробного значения показателя «P» формулы расчета ПСВ Банк России разъяснил следующее. Если значение суммы процентов в денежном выражении имеет несколько десятичных знаков после запятой, то оно округляется до целого числа.
Если по результатам округления показатель «Р» принимает нулевое значение, для целей расчета ПСВ рекомендуется применять округление до двух десятичных знаков после запятой.
5 правил работы с суммами
В современном программном обеспечении очень часто возникает необходимость выполнять различные операции с всевозможными суммами денег. Однако до сих пор мне нигде не попадалось документации, в которой были бы сведены воедино основные правила представления сумм и реализации финансовых вычислений. В этой статье я попробую сформулировать те правила, которые составил сам на основании личного опыта.
Не используйте double
О том, что для хранения сумм нельзя использовать двоичный тип с плавающей точкой одинарной точности float, знают все. Однако распространено мнение, что вместо float можно использовать double. Между тем double не намного лучше.
Дело в том, что в этих типах число представлено в виде сумм степеней с основанием 2. В то время как денежные суммы во всех прайсах и документах представляются в десятичной системе счисления. Большинство дробных чисел в десятичной системе счисления не имеют точного представления в виде конечной суммы степеней двойки.
Предположим в интернет-магазине продаются перчатки за 599 рублей 99 копеек. Вот как будет выглядеть это число в программах, использующих двоичные типы с плавающей точкой.
float 599.989990
double 599.990000000000009
То есть программа еще не сделала никаких вычислений, просто сохранила сумму в локальных переменных в двоичном формате, а в ней уже потеряна точность. В случае использования float — в 6-м знаке, в случае с double — в 15-м.
Ожидаемый пользователем вид сумма примет только при преобразовании ее в строку и неявном округлении числа до определенного десятичного знака. До этого в каждой сумме, в каждом промежуточном значении после каждого вычисления будет содержаться относительно небольшая ошибка. Причем в разных числах ошибка будет в разных позициях, и эта ошибка может накапливаться.
Гарантировать, что программа на любых объемах будет выдавать точный результат в таких условиях практически невозможно. И double может наоборот усугубить проблему, так как на нем заметить ошибку будет сложнее.
Проявиться ошибка точности может при сравнении чисел, которые вроде бы должны быть равны между собой, или сравнении остатка с нулем. Вот как это может выглядеть:
Результат
z
Вместо double надо использовать представление числа на основе степеней с основанием 10. В Java для этого предусмотрен тип BigDecimal, в C# — decimal.
Если ваш язык программирования не имеет такого типа, то его можно без труда реализовать. Надо просто создать структуру, содержащую знак ±, длинное целое число (для этого можно даже использовать простую строку цифр) и позицию десятичной точки, а затем реализовать над ней основные арифметические операции.
Сумма не может быть отрицательной
Количество денег не может быть меньше 0. Это может показаться странным для программиста в момент, когда он пишет код, но когда тот же программист пойдет в магазин, для него аксиома неотрицательности сумм будет очевидна. Ни разу при осуществлении покупок ни один покупатель не сказал кассиру: «Я вам должен еще минус сто рублей», — вместо: «Дайте мне сдачу сто рублей».
Дело в том, что при смене знака сумма всегда кардинально меняет смысл. Попробую продемонстрировать это на конкретных примерах.
Не так давно в новостях много рассказывалось о так называемом «техническом овердрафте», который якобы образовался на карточных счетах клиентов в одном российском банке. Могу предположить, как это произошло. У клиента на счете не было денег, подошло время списания средств за обслуживание счета, банк сделал проводку со счета клиента на свой счет доходов, в результате чего на счете образовался подозрительный отрицательный баланс. Клиент, конечно, больше никогда не прикоснется к такому счету, не станет больше пополнять его, так как по правилам сложения сумма его перевода сложится с отрицательным остатком на счете, и он потеряет часть своих денег. За клиента в этом плане можно не беспокоиться, а вот банк в таком случае имеет на своем счету доходов виртуальные средства. Если он их потратит на хозяйственную деятельность, то в итоге у него в балансе образуется дыра. А все потому, что на счет доходов записали средства, которых у клиента не было. Вместо этого надо было сделать совсем другую проводку, со счета задолженностей клиента на счет невыполненных обязательств. А поскольку затронуты ошибкой были некредитные карты, то такую проводку физически невозможно было сделать.
Здесь наглядно видно, что при смене знака сумма сразу меняет свое смысловое значение. Легко заметить, что, позволив суммам уходить в минус, разработчик открывает ящик пандоры, из которого могут вылететь неограниченные убытки для обслуживаемого бизнеса. Лучше заранее проверить сумму на неотрицательность и обезопасить систему от неожиданных финансовых потерь.
Заведите класс, содержащий сумму и категорию. Категория должна показывать назначение данной суммы: остаток на счете, цена, переплата, задолженность, обороты, сальдо и т. д. Как только в результате какой-либо операции возникает сумма меньше нуля, сразу выбрасывайте исключение или меняйте категорию суммы. Как правило, для полноценного учета хватает двух категорий — дебет и кредит.
Сумма — это не только число, но и валюта
Еще в средней школе нас всех учили, что в формулах надо указывать размерность величин и проверять ее. Килограммы нельзя складывать с метрами или сравнивать с литрами. Прежде чем умножить скорость на время, надо убедиться, что скорость указана в м/c, а время в секундах. Но при работе с суммами об этом часто забывают. Сумма — это физическая величина, и она имеет размерность. Поэтому надо работать с нею так, как учат на уроках физики.
Если система имеет дело исключительно с одной национальной валютой, то ее можно опустить, однако так бывает очень редко. Даже в пределах одной страны зачастую в ходу сразу несколько валют. Например, белорусский рубль до деноминации имеет обозначение BYR, а после деноминации — BYN. Если вы их перепутаете, это будет в 10 раз хуже, чем сложить метры с миллиметрами, потому что 1 BYN = 10 000 BYR. А еще говорят был BYB, для которого 1 BYR = 1000 BYB. Тем более важно контролировать размерность сумм в системе, которая работает с валютами разных стран.
Храните в базе данных и в памяти сумму вместе с валютой. Заведите для этого специальное свойство в классе, представляющем сумму. При выполнении операций контролируйте размерность и в случае ее нарушения выбрасывайте исключение. В качестве идентификатора валюты я обычно использую 3-символьный код ISO-4217.
Не используйте понятия «покупка» и «продажа»
Термины «покупка» и «продажа» — это бытовые понятия, которыми оперируют люди при выполнении повседневных задач. Люди ориентируются на систему координат, в которой они находятся в начальной точке отсчета. В финансах же любая сделка одновременно является и покупкой, и продажей.
Наберите в Яндексе «купить автомобиль», и половина ссылок в выдаче будет на объявления о продаже автомобилей, а другая — на объявления о покупке. То же самое будет, если поискать по запросу «аренда квартир», «сдать», «снять» и т. п.
Особенно наглядно такая двойственность проявляется при обмене валюты. Банки на своих сайтах предлагают курсы покупки и продажи различных валют. Как понять, что означает курс покупки доллара 56.61 руб.? Это банк по такой цене продает доллары или клиент рубли покупает? На самом деле пользователи, меняющие валюту, помнят, что 1 доллар стоит примерно пятьдесят с чем-то рублей, и что банк меняет валюту таким образом, чтобы получить прибыль, поэтому, когда надо обменять доллары на рубли, они смотрят на меньшую сумму в рублях, а когда надо обменять рубли на доллары — на большую. При этом, как правило, понять, что означают надписи «Покупка» или «Продажа» над цифрами, никто даже не пытается. Еще общая практика заключается в том, что меньшая сумма пишется слева, а большая — справа. Если написать одно предложение «Курс покупки израильского шекеля 15.75 руб.», мало кто угадает, что имеется в виду.
Когда разработчик пишет код, у него перед глазами нет конкретных значений, нет таблицы, где привычные цифры расположены в определенных местах, поэтому он ориентируется только на названия своих переменных. Если использовать названия типа buySum, sellSum, buyPrice, sellPrice и т. д., можно запросто перепутать обменные курсы. Такая же ситуация возможна и у сотрудников, которые эти курсы будут забивать в справочники.
Что будет, если клиент обнаружит, что ему предлагают обменять рубли на доллары по курсу 56 долларов за рубль? Он не будет писать в поддержку, он не станет жаловаться в фейсбуке, не будет скринить страницы. Предприимчивый клиент, скорее всего, поменяет все имеющиеся у него рубли и быстренько снимет все, что наменял.
Помните, что-то подобное уже было в новостях? Там, скорее всего, были нарушены 2 правила: перепутаны покупка с продажей и допущена отрицательная курсовая разница.
При автоматизации сделок вместе с понятиями «покупка» или «продажа» должны быть уточняющие слова типа «покупка клиентом» или «продажа банком». Но если вы автоматизируете биржу, то у вас и продавец, и покупатель — оба клиенты. Поэтому лучше всего использовать нейтральные понятия «сделка», «обмен», «дебет», «кредит», «зачисление», «списание» и т. д.
Обменный курс — это вектор из двух сумм
Примерно так выглядит стандартное предложение обмена валют для клиента:
Как оно должно быть реализовано в коде? Курс выглядит как сумма, поэтому к нему должны быть применимы общие правила.
Десятичное представление — OK.
Неотрицательное значение — OK.
Размерность —?
Давайте попробуем определить, какая размерность у тех цифр, которые обычно горят на табло обменных пунктов. На первый взгляд кажется, что там везде рубли, но какие операции мы можем с ними сделать? Можно ли сложить курс покупки доллара 55.61 руб. с остатком на счете 1500.00 руб.? Нельзя, потому что настоящая размерность обменного курса представляет собой руб./доллар или, еще точнее, валюта-1/валюта-2.
А еще можно вспомнить, что для «удобства» в некоторых валютах используются коэффиценты. Например, для йены используется курс за 100 единиц валюты. Поэтому под суммой в 1-й валюте есть еще коэффициент во 2-й валюте.
Получается, размерность — валюта-1/(валюта-2 * коэффициент)?
Если посмотреть внимательно на таблицу значений курсов, то становится понято, что в зависимости от направления обмена, смысл значений меняется на противоположный.
В случае с «курсом покупки» клиент дает банку 1$ и получает 56.61₽.
В случае с «курсом продажи» клиент дает банку 58.79₽ и получает 1$.
Вот в таком виде спутать различные обменные курсы никак не получится. Ведь у них размерности разные.
Только не надо делить 100 йен на 52.79 рублей, так как получившееся число придется округлить, и потеряется точность.
В итоге, с учетом всех нюансов, курс обмена будет выглядеть как-то так:
4.4 – Целочисленные типы данных со знаком
Тип | Минимальный размер | Примечание |
---|---|---|
short | 16 бит | |
int | 16 бит | На современных архитектурах размер обычно составляет 32 бита |
long | 32 бита | |
long long | 64 бита |
Ключевое различие между различными целочисленными типами заключается в том, что они имеют разные размеры – бо́льшие целочисленные типы могут содержать больши́е числа.
Напоминание
C++ гарантирует только то, что целочисленные типы будут иметь определенный минимальный размер, а не то, что они будут иметь конкретный размер. Для получения информации о том, как определить размер каждого типа на вашем компьютере, смотрите урок «4.3 – Размеры объектов и оператор sizeof ».
Целочисленные значения со знаком
По умолчанию целочисленные значения со знаком, что означает, что знак числа сохраняется. Следовательно, целочисленное значение со знаком может содержать как положительные, так и отрицательные числа (и 0).
В этом уроке мы сосредоточимся на целочисленных значениях со знаком. Беззнаковые целочисленные значения (которые могут содержать только неотрицательные числа) мы обсудим в следующем уроке.
Определение целочисленных значений со знаком
Ниже показан предпочтительный способ определения четырех типов целочисленных значений со знаком:
Все целочисленные значения (кроме int ) могут иметь необязательный суффикс int :
Целочисленные типы также могут принимать необязательное ключевое слово signed (т.е. со знаком), которое по соглашению обычно помещается перед именем типа:
Однако это ключевое слово так же не следует использовать, поскольку оно избыточно, так как по умолчанию целочисленные значения уже со знаком.
Лучшая практика
Диапазоны целочисленных значений со знаком
Как вы узнали в предыдущем разделе, переменная размером n бит может содержать 2 n возможных значений. Но каких именно значений? Набор конкретных значений, которые тип данных может принимать, мы называем его диапазоном. Диапазон целочисленной переменной определяется двумя факторами: ее размером (в битах) и тем, со знаком она или нет.
В качестве отступления.
Ниже показана таблица, содержащая диапазон целочисленных значений со знаком разных размеров:
Для тех, кто не склонен к математике… воспользуйтесь таблицей. 🙂
Переполнение целочисленных значений
Что произойдет, если мы попытаемся присвоить значение 280 8-битному целочисленному значению со знаком? Это число выходит за пределы диапазона, который может содержать 8-битовое целочисленное значение со знаком. Для числа 280 требуется 9 бит (плюс 1 бит для знака), но в 8-битном целочисленном значении со знаком у нас есть только 7 бит (плюс 1 бит для знака).
Переполнение целочисленных значений (часто для краткости называемое просто переполнением) происходит, когда мы пытаемся сохранить значение, выходящее за пределы диапазона типа. По сути, число, которое мы пытаемся сохранить, требует для представления большее количества бит, чем доступно объекту. В таком случае данные теряются, потому что объекту для хранения всего не хватает памяти.
В случае целочисленных значений со знаком, какие биты теряются, точно не определено, таким образом, переполнение целочисленного значения со знаком приводит к неопределенному поведению.
Предупреждение
Переполнение целочисленного значения со знаком приведет к неопределенному поведению.
Как правило, переполнение приводит к потере информации, что почти никогда не бывает желательно. Если есть подозрение, что объекту может потребоваться сохранить значение, выходящее за пределы его диапазона, используйте тип с большим диапазоном!
Деление целочисленных значений
При делении двух целочисленных значений, когда частное представляет собой целое число, C++ работает так, как вы ожидаете:
Это дает ожидаемый результат:
Но давайте посмотрим, что происходит, когда целочисленное деление приводит к дробному результату:
Это дает, возможно, неожиданный результат:
При делении двух целочисленных значений (так называемое целочисленное деление) C++ всегда дает целочисленный результат. Поскольку целые числа не могут содержать дробные значения, любая дробная часть просто отбрасывается (не округляется!).
Предупреждение
Будьте осторожны при использовании целочисленного деления, так как вы потеряете дробную часть частного. Однако, если это то, что вам нужно, то целочисленное деление использовать можно, так как результаты предсказуемы.
Если вам необходимы дробные результаты, мы покажем способ их получить в уроке «5.2 – Арифметические операторы».
Форматы и типы данных
Кодировка UTF-8
Суммы платежей
Все суммы платежей, передаваемые на Payment Page или полученные в ответах и оповещениях, передаются целочисленным значением в минорных единицах валюты в соответствии с ISO 4217; размер дробной части приведен в таблице Active codes, столбец E.
Минорной единицей валюты называется часть номинальной единицы валюты, обычно, 1/100. Например, 1 цент США равен 1/100 доллара США. Примеры соотношения номинальных и минорных единиц валют приведены в таблице ниже.
Сумма в номинальных единицах валюты | Сумма в минорных единицах валюты |
---|---|
450,66 GBP | 45066 |
39,95 USD | 3995 |
200 JPY | 200 |
150,155 KWD | 150155 |
Страны
При передаче информации о странах Payment Page получает и передает код страны в соответствии с ISO 3166-1 alpha-2.
Даты и время
Даты и время, передаваемые на Payment Page или полученные в ответах и оповещениях, передаются в UTC+0. Дата и время указываются в соответствии с ISO 8601.
Валюты
Все валюты, передаваемые на Payment Page или полученные в ответах и оповещениях, передаются в соответствии со стандартом ISO 4217 alpha-3.
Языки
Все языки, передаваемые на Payment Page или полученные в ответах и оповещениях, передаются в соответствии со стандартом ISO 639-1 alpha-2.
целочисленное значение
целочисленное значение
—
[Я.Н.Лугинский, М.С.Фези-Жилинская, Ю.С.Кабиров. Англо-русский словарь по электротехнике и электроэнергетике, Москва, 1999 г.]
Тематики
Смотреть что такое «целочисленное значение» в других словарях:
неотрицательное целочисленное значение — Значение, большее нуля или равное нулю (МСЭ Т Х.692). [http://www.iks media.ru/glossary/index.html?glossid=2400324] Тематики электросвязь, основные понятия EN non negative integer value … Справочник технического переводчика
неположительное целочисленное значение — Значение, меньшее нуля или равное нулю. (МСЭ Т Х.692). [http://www.iks media.ru/glossary/index.html?glossid=2400324] Тематики электросвязь, основные понятия EN non positive integer value … Справочник технического переводчика
отрицательное целочисленное значение — Значение, меньшее нуля (МСЭ Т Х.692). [http://www.iks media.ru/glossary/index.html?glossid=2400324] Тематики электросвязь, основные понятия EN negative integer value … Справочник технического переводчика
положительное целочисленное значение — Значение, большее нуля (МСЭ Т Х.692). [http://www.iks media.ru/glossary/index.html?glossid=2400324] Тематики электросвязь, основные понятия EN positive integer value … Справочник технического переводчика
SSE4 — SSE4 новый набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD)[1]. Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной… … Википедия
Алгоритм точки в многоугольнике — Проверка принадлежности данной точки данному многоугольнику На плоскости даны многоугольник и точка. Многоугольник может быть как выпуклым, так и невыпуклым. Требуется решить вопрос о принадлежности точки многоугольнику. Благодаря тому, что… … Википедия
ТОПОЛОГИЧЕСКИЙ СОЛИТОН — солитон с нетривиальной топологич. характеристикой (типа степени отображения, инварианта Хопфа и т … Физическая энциклопедия
Неорганические кислоты — Основная статья: Кислота Неорганические (минеральные) кислоты неорганические вещества, обладающие комплексом физико химических свойств, которые присущи кислотам. Вещества кислотной природы известны для большинства химических элементов за… … Википедия
Management Information Base — (MIB, база управляющей информации) виртуальная база данных, используемая для управления объектами в сети связи. Наиболее часто это понятие связывают с Simple Network Management Protocol (SNMP), но также оно используется в более широком смысле в… … Википедия
Теория Редже — подход к задаче рассеяния в квантовой механике и квантовой теории поля, в котором изучаются свойства амплитуды рассеяния при комплексных значениях орбитального углового момента. Основы теории были разработаны итальянским физиком Туллио Редже в… … Википедия