Что банки на самом деле используют в качестве типа данных для денег? [закрыто]

9

Я знаю несколько хороших вариантов :

  1. Большие целые числа (например, int64_t, mpz_t, любая библиотека bignum ) для представления центов или 10 -n центов - скажем, целое число представляет 1/100 копейки ($ 1,05 == 10500). Это называется масштабированным целым числом .

  2. Библиотека высокого уровня для десятичной арифметики произвольной точности, такой как BigDecimal в Java, Decimal в Python, decimal.js в Javascript, boost :: multiprecision в C ++

  3. Строки.

  4. Упакованные BCD (двоично-десятичные дроби) - более эзотерический метод, который казался популярным в старом программном обеспечении. Узнайте больше об этом.

В производственном коде для банков (или кредитных карт, банкоматов, POS-систем), какой тип данных используется чаще всего? Я особенно спрашиваю тех, кто работал на банки.

РЕДАКТИРОВАТЬ: Супер полезные ссылки для тех, кто с той же проблемной области (необходимо реализовать структуру данных "деньги", которая не нарушается).

РЕДАКТИРОВАТЬ для парня, который сказал, что это дублирующий вопрос : это практический, а не теоретический вопрос «что лучше». Прочитайте неотредактированное название моего вопроса. Я спрашиваю, что люди видели из первых рук в кодах банков.

Я знаю, что BigDecimal «лучший», очевидно, но подобные API-интерфейсы, подобные этим, не везде доступны, верите или нет, а десятичные библиотеки стоят дороже, чем целочисленные.

ZELCON
источник
4
Вид банка связан, хотя не специально для банка. Несколько лет назад я работал над системой, связанной с транзакциями и платежами, и мы обошли floatbugs, представив совершенно новый тип данных, класс, состоящий не только из двух 64-битных целых чисел, одно из которых представляет целое число, а другое - десятичную часть.
Энди
1
Дэвид Пэкер, это отличная идея. Я думаю, что это может быть лучше, чем обычная реализация, которая представляет собой структуру из двух целых чисел: большого числа и показателя степени (значение log_10)
zelcon
1
Вопросу нужен 4-й вариант: BCD
Брендан,
3
Чтобы ответить на вопрос в названии, COBOL S9 (13) V99 COMP-3. Умещается в 8 8 битных байтов.
Гилберт Ле Блан
2
Проблема у вас здесь в том, «какой банк». они используют COBOL, Java, C / C ++, .NET и т. д. - нет ответа, который бы соответствовал тому, что вы хотите знать, поскольку каждый из них использует разные типы. Вы можете спросить о резервном хранилище, но даже в этом случае будут использоваться десятичные типы Oracle или тип мэйнфрейма в зависимости от используемой технологии.
gbjbaanb

Ответы:

-2

Большинство банков по-прежнему на мэйнфреймах. Типы данных на мэйнфреймах очень неуклюжи по сегодняшним стандартам. Они могут быть просто цифрами, закодированными как символы. Таким образом, 1234.56 действительно будет строкой, содержащей эти цифры. И символ может быть 4, 6 или 9 бит. Или в «оптимизированных» ситуациях могут быть две цифры, упакованные в один символ. В конце концов, вам нужно только 4 бита (клев) для десятичного знака.

Вы бы удивились, как на земле они когда-либо сталкивались с этими решениями. Они часто основаны на аппаратной архитектуре. Мы привыкли к множеству 8-битных архитектур. В старые времена это было не дано.

Unisys использует 36-битные слова, и слова могут быть разбиты на 6-битные, 9-битные, 12-битные или 18-битные части перед использованием для хранения данных.

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

Мартин Маат
источник
1
@gnat: Это год и несколько корыстный; Как банки поддерживают финансовые данные? Мейнфреймы .
Гилберт Ле Блан
2
-1 для « Типы данных на мэйнфреймах очень неуклюжи по сегодняшним стандартам». Вы, очевидно, ничего не знаете о мэйнфреймах. IEEE-754 с плавающей запятой, десятичных данных и т . Д. Предостаточно.
Росс Паттерсон
1
@Ross IEEE 754 была основана в 1985 году. Многие мэйнфреймы намного старше. BCD и подобные кодировки все еще очень распространены в активных системах мэйнфреймов. И они не очень хорошо сравниваются с современными кодировками. Но, пожалуйста, дайте нам правильный ответ на вопрос. Вы, очевидно, много знаете о мэйнфреймах. Хотя, кажется, ваше время отсрочено на пару десятилетий ... Просветите нас.
Мартин Маат
1
.NET имеет хороший тип, называемый Decimal .., который очень медленный и не совсем полезен при обработке миллионов транзакций. Слава богу, у нас есть мэйнфреймы с их архаичной, но быстрой обработкой данных.
gbjbaanb
1
@MartinMaat Упакованные десятичные числа были наиболее распространены для значений валют, когда я начал программировать в 1972 году. Это был базовый тип данных в семействе IBM S / 360, и я считаю, что до этого он был частью коммерческого варианта серии 1400.
Росс Паттерсон