Co banki faktycznie wykorzystują jako typ danych dla pieniędzy? [Zamknięte]

9

Mam świadomość kilku dobrych opcji :

  1. 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ą .

  2. 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 ++

  3. Smyczki.

  4. 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).

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.

zelcon
źródło
4
Rodzaj banku związany, ale nie specjalnie dla banku. Kilka lat temu pracowałem nad systemem zajmującym się transakcjami i płatnościami i omijaliśmy błędy typu float, wprowadzając zupełnie nowy typ danych, klasę składającą się nie tylko z dwóch liczb całkowitych 64-bitowych, z których jedna reprezentuje liczbę całkowitą, a drugą część dziesiętną.
Andy
1
David Packer to świetny pomysł. Myślę, że może to być lepsze niż wspólna implementacja, która jest strukturą dwóch liczb całkowitych: dużej liczby i wykładnika (wartość log_10)
zelcon
1
Pytanie wymaga czwartej opcji: BCD
Brendan
3
Aby odpowiedzieć na pytanie w tytule, COBOL S9 (13) V99 COMP-3. Mieści 8 8 bajtów.
Gilbert Le Blanc
2
Problem, który tu masz, to „który bank”. używają COBOL, Java, C / C ++, .NET itp. - nie ma odpowiedzi, która pasowałaby do tego, co chcesz wiedzieć, ponieważ każdy z nich używa różnych typów. Możesz zapytać o miejsce do przechowywania kopii zapasowej, ale nawet wtedy będą stosowane typy dziesiętne Oracle lub typ mainframe w zależności od zastosowanej technologii.
gbjbaanb

Odpowiedzi:

-2

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.

Martin Maat
źródło
1
@gnat: To jest roczek i trochę samolubny; Jak banki przechowują dane finansowe? Komputery mainframe .
Gilbert Le Blanc
2
-1 dla „ Typy danych na komputerach mainframe są bardzo niezdarne w stosunku do dzisiejszych standardów. ” Oczywiście nic nie wiesz o komputerach mainframe. Liczne są liczby zmiennoprzecinkowe IEEE-754, dane dziesiętne itp .
Ross Patterson
1
@Ross IEEE 754 powstał w 1985 roku. Wiele programów na komputery mainframe jest znacznie starszych. BCD i podobne kodowania są nadal bardzo popularne w aktywnych systemach mainframe. I nie porównują się dobrze z nowoczesnymi kodowaniami. Proszę jednak podać właściwą odpowiedź na pytanie. Oczywiście dużo wiesz o komputerach mainframe. Chociaż wydaje ci się, że twoje wyczucie czasu jest opóźnione o kilka dekad ... Oświeć nas.
Martin Maat
1
.NET ma ładny typ o nazwie Dziesiętny…, który jest naprawdę wolny i niezbyt przydatny przy przetwarzaniu milionów transakcji. Dzięki Bogu mamy komputery mainframe z ich archaicznym, ale szybkim przetwarzaniem danych.
gbjbaanb
1
@MartinMaat Pack po przecinku był najbardziej powszechny w przypadku wartości walutowych, kiedy zacząłem programować w 1972 roku. Był to podstawowy typ danych w rodzinie IBM S / 360 i uważam, że wcześniej był on częścią opcji komercyjnej serii 1400.
Ross Patterson