Я знаю несколько хороших вариантов :
Большие целые числа (например, int64_t, mpz_t, любая библиотека bignum ) для представления центов или 10 -n центов - скажем, целое число представляет 1/100 копейки ($ 1,05 == 10500). Это называется масштабированным целым числом .
Библиотека высокого уровня для десятичной арифметики произвольной точности, такой как BigDecimal в Java, Decimal в Python, decimal.js в Javascript, boost :: multiprecision в C ++
Строки.
Упакованные BCD (двоично-десятичные дроби) - более эзотерический метод, который казался популярным в старом программном обеспечении. Узнайте больше об этом.
В производственном коде для банков (или кредитных карт, банкоматов, POS-систем), какой тип данных используется чаще всего? Я особенно спрашиваю тех, кто работал на банки.
РЕДАКТИРОВАТЬ: Супер полезные ссылки для тех, кто с той же проблемной области (необходимо реализовать структуру данных "деньги", которая не нарушается).
- http://martinfowler.com/eaaDev/quantity.html
- http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR
- http://c2.com/cgi/wiki?MoneyObject
- http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency
- http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
РЕДАКТИРОВАТЬ для парня, который сказал, что это дублирующий вопрос : это практический, а не теоретический вопрос «что лучше». Прочитайте неотредактированное название моего вопроса. Я спрашиваю, что люди видели из первых рук в кодах банков.
Я знаю, что BigDecimal «лучший», очевидно, но подобные API-интерфейсы, подобные этим, не везде доступны, верите или нет, а десятичные библиотеки стоят дороже, чем целочисленные.
источник
Ответы:
Большинство банков по-прежнему на мэйнфреймах. Типы данных на мэйнфреймах очень неуклюжи по сегодняшним стандартам. Они могут быть просто цифрами, закодированными как символы. Таким образом, 1234.56 действительно будет строкой, содержащей эти цифры. И символ может быть 4, 6 или 9 бит. Или в «оптимизированных» ситуациях могут быть две цифры, упакованные в один символ. В конце концов, вам нужно только 4 бита (клев) для десятичного знака.
Вы бы удивились, как на земле они когда-либо сталкивались с этими решениями. Они часто основаны на аппаратной архитектуре. Мы привыкли к множеству 8-битных архитектур. В старые времена это было не дано.
Unisys использует 36-битные слова, и слова могут быть разбиты на 6-битные, 9-битные, 12-битные или 18-битные части перед использованием для хранения данных.
Просто будьте рады, что нам больше не придется иметь дело с этим. .NET Framework имеет хороший тип, называемый десятичным, который подходит для валют.
источник