Apa yang sebenarnya bank gunakan sebagai tipe data untuk uang? [Tutup]

9

Saya mengetahui beberapa opsi bagus :

  1. Bilangan bulat besar (misalnya, int64_t, mpz_t, setiap bignum lib ) untuk mewakili sen atau 10 n sen-katakanlah, sebuah integer merupakan 1/100 dari satu sen ($ 1,05 == 10500). Ini disebut integer berskala .

  2. Pustaka tingkat tinggi untuk aritmatika desimal presisi sembarang seperti BigDecimal di Jawa, Desimal di Python, decimal.js di Javascript, boost :: multiprecision di C ++

  3. String.

  4. BCD yang dikemas (desimal kode biner) adalah metode yang lebih esoteris yang tampaknya populer di perangkat lunak lama. Baca lebih lanjut tentang itu.

Dalam kode produksi untuk bank (atau kartu kredit, ATM, sistem POS), tipe data apa yang paling sering digunakan? Saya terutama bertanya kepada mereka yang bekerja di bank.

EDIT: Tautan super berguna bagi mereka yang memiliki domain masalah yang sama (perlu menerapkan struktur data "uang" yang tidak rusak).

EDIT untuk orang yang mengatakan ini adalah pertanyaan duplikat : Ini adalah pertanyaan praktis bukan teoritis tentang "apa yang terbaik". Baca judul pertanyaan saya yang belum diedit. Saya bertanya apa yang dilihat orang secara langsung dalam basis kode bank.

Saya tahu BigDecimal jelas "terbaik", tetapi API yang bagus seperti itu tidak tersedia di mana-mana, percaya atau tidak, dan pustaka desimal lebih mahal daripada ints.

zelcon
sumber
4
Jenis bank terkait walaupun tidak khusus untuk bank. Beberapa tahun yang lalu saya bekerja pada sistem yang berurusan dengan transaksi dan pembayaran dan kami menghindari floatbugs dengan memperkenalkan tipe data yang benar-benar baru, sebuah kelas, yang terdiri dari tidak hanya tetapi dua bilangan bulat 64bit, satu mewakili seluruh bilangan, yang lain merupakan bagian desimal.
Andy
1
David Packer itu ide bagus. Saya pikir mungkin lebih baik dari pelaksanaan umum, yang merupakan struct dari dua bilangan bulat: sejumlah besar dan eksponen (nilai ini log_10)
zelcon
1
Pertanyaan membutuhkan opsi ke-4: BCD
Brendan
3
Untuk menjawab pertanyaan dalam judul, COBOL S9 (13) V99 COMP-3. Cocok dalam 8 8 bit byte.
Gilbert Le Blanc
2
Masalah yang Anda miliki di sini adalah "bank mana". mereka menggunakan COBOL, Java, C / C ++, .NET dll - tidak ada jawaban yang sesuai dengan yang ingin Anda ketahui karena masing-masing menggunakan jenis yang berbeda. Anda bisa bertanya tentang penyimpanan dukungan, tetapi bahkan kemudian tipe desimal Oracle, atau tipe mainframe akan digunakan tergantung pada teknologi yang digunakan.
gbjbaanb

Jawaban:

-2

Sebagian besar bank masih menggunakan mainframe. Tipe data pada mainframe sangat canggung dengan standar saat ini. Mereka mungkin hanya digit yang dikodekan sebagai karakter. Jadi 1234.56 benar-benar akan menjadi string yang berisi angka-angka itu. Dan satu karakter bisa 4, 6 atau 9 bit. Atau, dalam situasi "optimal", mungkin ada dua digit yang dikemas dalam satu karakter. Lagi pula, Anda hanya perlu 4 bit (nibble) untuk karakter desimal.

Anda akan bertanya-tanya bagaimana mereka datang dengan solusi ini. Mereka sering berbasis pada arsitektur perangkat keras. Kami terbiasa dengan kelipatan arsitektur 8-bit. Di masa lalu ini tidak diberikan.

Unisys menggunakan kata-kata 36-bit dan kata-kata dapat dipecah menjadi bagian 6-bit, 9-bit, 12-bit atau 18-bit sebelum digunakan untuk menyimpan data.

Bersyukurlah kita tidak harus berurusan dengan hal-hal ini lagi. Kerangka NET. Memiliki jenis yang bagus disebut desimal yang baik untuk mata uang.

Martin Maat
sumber
1
@gnat: Ini berumur satu tahun dan agak mementingkan diri sendiri; Bagaimana Bank Memelihara Data Keuangan? Mainframe .
Gilbert Le Blanc
2
-1 untuk " Tipe data pada mainframe sangat canggung dengan standar saat ini. " Anda jelas tidak tahu apa-apa tentang mainframe. IEEE-754 mengapung, data desimal, dll berlimpah.
Ross Patterson
1
@Ross IEEE 754 didirikan pada tahun 1985. Banyak perangkat lunak mainframe jauh lebih tua. BCD dan pengkodean serupa masih sangat umum di sistem mainframe aktif. Dan mereka tidak bisa dibandingkan dengan pengkodean modern. Tapi tolong, beri kami jawaban yang tepat untuk pertanyaan itu. Anda jelas tahu banyak tentang mainframe. Meskipun waktu Anda tampaknya tidak aktif dalam beberapa dekade ... Cerahkan kami.
Martin Maat
1
.NET memiliki tipe yang bagus bernama Desimal .. yang benar-benar lambat dan tidak terlalu berguna saat memproses jutaan transaksi. Terima kasih Tuhan kami memiliki mainframe dengan data mereka yang kuno, tetapi cepat, prosesnya.
gbjbaanb
1
@MartinMaat Pack desimal adalah yang paling umum untuk nilai mata uang, ketika saya memulai pemrograman pada tahun 1972. Itu adalah tipe data dasar pada keluarga S / 360 IBM, dan saya percaya itu adalah bagian dari opsi komersial pada seri 1400 sebelumnya.
Ross Patterson