В работе с трейдинговыми системами наткнулся на необычный формат представления чисел, представляющих котировки ценных бумаг, в частности для государственных облигаций правительства США. Например, цена, представленная как
Вся хитрость тут в том, что это не привычная десятичная запись. Например,
Итак, данный формат записи дробных чисел называется «thirty seconds» или
где
или
то есть для числа
Чтобы формула была корректной,
Видно, что в трех дробных разрядах кодируется не 1000 долей, как в десятичной системе, а только 256 (32 * 8).
Итак, еще раз: если написано
Формула обратного перевода из десятичного представления в формат
Если
Компонента
Как бы ни причудливо не выглядел подобный способ записи денежных сумм, именно его используют трейдеры (не путать с рейдерами), например, при ведении торгов государственным облигациями США. Могу предположить, что это просто наследие времен, когда далеко не все знали дробные десятичные числа, а запись частей целого в виде натуральных дробей гораздо ближе к натуре человека. Разделить кучку на две, три и т.д. части может даже ребенок, необученный десятичным дробям.
Формат странный, но знать его приходится.
100-31
далеко не означает 100 долларов и 31 цент, или 100-127
вообще имеет мало смысла, так как в одном долларе всего 100 центов, а не 1000, и нет необходимости резервировать под дробную часть три знака после запятой. Вся хитрость тут в том, что это не привычная десятичная запись. Например,
100-31
в десятичной форме равно 100.97265625
, а 100-127
соответствует 100.40234375
.Итак, данный формат записи дробных чисел называется «thirty seconds» или
32nd
. Для визуального удобства и явного отличия от десятичной формы вместо точки в качестве разделителя используется маленькая черточка. А само число имеет в общем следующий формат:AAA.XXY
где
AAA
— это целая часть числа, имеющая такой же смысл, как и в десятичной системе. XX
— это количество 1/32
-х долей от дробной части, а Y
— это количество восьмушек (1/8
) в последней 1/32
доле. Несмотря на туманное описание, формула перевода числа AAA.XXY
в формате 32nd
в десятичный формат весьма проста:D = AAA + (XX + Y * 1/8) * 1/32
или
D = AAA + XX * (1/32) + Y * (1/256)
то есть для числа
100-127
ААА=100, XX=12, Y=7, поэтому: D = 100 + 12/32 + 7/256 = 100.40234375
Чтобы формула была корректной,
XX
может принимать значения только от "00"
до "31"
, а Y
от "0"
до "7"
. Также при записи Y
число 4
может быть заменено на +
, а "0"
на пробел. То есть 100-31
в полной форме записи равно 100-310
, а 100-12+
эквивалентно 100-124
.Видно, что в трех дробных разрядах кодируется не 1000 долей, как в десятичной системе, а только 256 (32 * 8).
Итак, еще раз: если написано
100-12+
, то это 100.39062500
в десятичной системе.Формула обратного перевода из десятичного представления в формат
32nd
не многим сложнее. Пусть D
десятичное число:A = TRUNC(D)
XX = TRUNC((D - A) * 32)
Y = ((D - A) * 32 - XX) * 8
TRUNC
— это функция взятия целой части.Если
Y
равно 0, то можно этот разряд не писать, а если 4, то можно заменить на +
. Компонента
Y
должна получиться обязательно целочисленной. Иначе, наличие дробной части у Y
— это признак, того, что исходное десятичное число D
не имеет отображения в формат 32nd
(только 256 значений дробной части из всех 1000 возможных могут иметь соответствие в формате 32nd
). Как бы ни причудливо не выглядел подобный способ записи денежных сумм, именно его используют трейдеры (не путать с рейдерами), например, при ведении торгов государственным облигациями США. Могу предположить, что это просто наследие времен, когда далеко не все знали дробные десятичные числа, а запись частей целого в виде натуральных дробей гораздо ближе к натуре человека. Разделить кучку на две, три и т.д. части может даже ребенок, необученный десятичным дробям.
Формат странный, но знать его приходится.