Mam świadomość kilku dobrych opcji :
Duże liczby całkowite (np. Int64_t, mpz_t, dowolny bignum lib ) do reprezentowania centów lub 10- n centów - powiedzmy, liczba całkowita reprezentuje 1/100 grosz (1,05 $ == 10500). Nazywa się to skalowaną liczbą całkowitą .
Biblioteka wysokiego poziomu dla arytmetyki dziesiętnej o dowolnej precyzji, taka jak BigDecimal w Javie, Decimal w Pythonie, decimal.js w JavaScript, boost :: multiprecision w C ++
Smyczki.
Pakowane BCD (dziesiętnie kodowane binarnie) to bardziej ezoteryczna metoda, która wydawała się popularna w starym oprogramowaniu. Przeczytaj więcej na ten temat .
W kodzie produkcyjnym dla banków (lub kart kredytowych, bankomatów, systemów POS) jaki typ danych jest faktycznie najczęściej używany? Szczególnie pytam tych, którzy pracowali dla banków.
EDYCJA: Super przydatne linki dla osób z tą samą domeną problemową (potrzebujących zaimplementować strukturę danych „pieniędzy”, która się nie psuje).
- 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
EDYTUJ dla osoby, która powiedziała, że jest to duplikat : jest to praktyczne, a nie teoretyczne pytanie „co jest najlepsze”. Przeczytaj niezredagowany tytuł mojego pytania. Pytam, co ludzie widzieli z pierwszej ręki w bazach kodów banków.
Wiem, że BigDecimal jest oczywiście „najlepszy”, ale takie ładne interfejsy API nie są dostępne wszędzie, wierzcie lub nie, a biblioteki dziesiętne są drogie w przeciwieństwie do int.
źródło
Odpowiedzi:
Większość banków nadal korzysta z komputerów mainframe. Typy danych na komputerach mainframe są bardzo niezdarne w stosunku do dzisiejszych standardów. Mogą to być tylko cyfry zakodowane jako znaki. Zatem 1234.56 naprawdę byłby ciągiem zawierającym te cyfry. A znak może mieć 4, 6 lub 9 bitów. Lub w „zoptymalizowanych” sytuacjach dwie cyfry mogą być spakowane w jeden znak. W końcu potrzebujesz tylko 4 bitów (skubka) na znak dziesiętny.
Zastanawiacie się, jak, u licha, kiedykolwiek przyszło im na myśl te rozwiązania. Często są oparte na architekturze sprzętowej. Jesteśmy przyzwyczajeni do wielu architektur 8-bitowych. W dawnych czasach nie było to dane.
Unisys używa 36-bitowych słów, a słowa mogą zostać podzielone na 6-bitowe, 9-bitowe, 12-bitowe lub 18-bitowe części, zanim zostaną użyte do przechowywania danych.
Po prostu ciesz się, że nie będziemy już musieli sobie z tym radzić. .NET Framework ma ładny typ zwany decimal, który jest dobry dla walut.
źródło