Artikel ini terinspirasi oleh pengalaman pribadi ketika saya ikut mengembangkan sistem informasi akuntansi (SIA) di kampus dan juga tulisan Martin Fowler1 dan John N. Armstrong2. Sebenarnya ada banyak hal yang ingin saya tulis dari pengalaman saya (yang masih seumur jagung) dalam mengembangkan sistem informasi. Mudah-mudahan kalau saya sempat niat tersebut dapat terlaksana :-D .

Jadi, kenapa tipe data uang dibutuhkan? Kenapa tidak menggunakan tipe data numerik yang sudah disediakan oleh bahasa pemrograman seperti integer atau floating-point? Fowler menyampaikan dua alasan utama, yang pertama adalah masalah perbedaan mata uang (currency). Masalah ini tidak akan saya bahas karena hingga saat ini saya hanya mengembangkan aplikasi sistem informasi dengan mata uang rupiah saja :-D . Permasalahan yang kedua adalah masalah pembulatan. Jika masalah pembulatan ini tidak diperhatikan maka kita dapat kehilangan atau kelebihan nilai sen dalam perhitungan keuangan yang dilakukan dalam aplikasi kita. Tipe data numerik yang disediakan oleh kebanyakan bahasa pemrograman menangani kedua permasalahan tersebut. Namun, bahasa pemrograman berorientasi objek memungkinkan kita untuk menangani masalah tersebut dengan membuat kelas Uang sendiri.

Pertama-tama, kita membutuhkan properti pada kelas Uang yang akan dibuat untuk menyimpan jumlah uang. Menurut Fowler tipe data yang tepat untuk menyimpan jumlah uang adalah integer atau fixed decimal. Menyimpan jumlah uang dengan tipe data double tidak tepat karena presisi dari tipe data tersebut tidak terjamin. Hal tersebut ditunjukkan oleh contoh berikut (dalam bahasa Java):


double val = 0.00;
for (int i=0; i < 10; i++) val += 0.10;
System.out.println( val == 1.00 );

Potongan kode di atas akan menghasilkan keluaran false. Dalam perhitungan keuangan diperlukan tingkat presisi yang pasti, oleh karena itulah tipe data double bukan merupakan pilihan yang tepat. Tipe data integer digunakan ketika kita tidak memerlukan bagian sen atau jika kita menyimpan nilai uang dalam sen. Tipe fixed decimal tidak disediakan secara built-in oleh kebanyakan bahasa pemrograman, namun Java Standard API menyediakan kelas BigDecimal yang merepresentasikan fixed decimal (saya tidak tahu untuk bahasa pemograman yang lain).

Operasi penjumlahan dan pengurangan dapat dilakukan secara normal menggunakan operator yang ada atau menggunakan method yang disediakan oleh kelas BigDecimal (jika kelas BigDecimal yang digunakan). Namun, jika aplikasi yang kita buat menangani lebih dari satu mata uang maka kita harus memperhitungkan penjumlahan/pengurangan untuk mata uang yang berbeda. Cara yang paling mudah dan sederhana untuk menangani kasus tersebut adalah dengan tidak mengizinkannya (melemparkan eksepsi).

Proses perkalian dan pembagian harus memperhatikan masalah pembulatan. Jenis pembulatan (floor, ceil, round) bisa berbeda sesuai dengan aturan atau konvensi yang diberlakukan pada sistem yang kita buat. Ada juga kasus khusus ketika kita ingin mengalokasikan uang menjadi beberapa bagian. Berikut adalah contoh yang diberikan oleh Fowler: misal kita harus mengalokasikan uang 5 sen ke dua akun. Jika kita menggunakan pembagian biasa maka kita akan mendapatkan 3,5 sen dan 1,5 sen. Jika kita menggunakan pembulatan round maka 3,5 sen menjadi 4 sen dan 1,5 sen menjadi 2 sen. Jadi kita mendapatkan tambahan 1 sen. Jika floor yang digunakan maka 3,5 sen menjadi 3 sen dan 1,5 sen menjadi 1 sen. Jadi kita kehilangan 1 sen. Contoh tersebut menunjukkan bahwa kita harus mampu menangani kasus alokasi uang. Beberapa solusi untuk masalah alokasi uang telah dibahas oleh Fowler.

Penting juga bagi kita untuk memperhatikan tampilan uang ketika dicetak atau dilihat pengguna. Biasanya nilai uang akan ditampilkan dengan titik/koma untuk memisahkan tiap 3 digit dan koma/titik untuk memisahkan antara bagian bulat dan bagian sen. Pembuatan method untuk mengatur tampilan uang tersebut akan memberikan tampilan yang baik untuk antarmuka pengguna dan laporan yang dihasilkan. Akan lebih baik pula jika kita membuat method untuk menangani penerjemahan masukan string nilai uang yang dimasukkan pengguna (kebalikan dari proses menampilkan nilai uang).

Setelah diuraikan hal-hal apa saja yang perlu diperhatikan dalam pembuatan tipe data uang, maka bagaimana immplementasinya? Untuk masalah implementasi Anda harus bersabar menunggu artikel berikutnya :-D . Saya berencana menulis mengenai implementasi tipe data uang dalam PHP. Untuk implementasi pada Java Anda bisa merujuk pada Fowler dan Armstrong. Implementasi Armstrong didistribusikan dengan lisensi GPL dan disertai dengan dokumentasi yang cukup lengkap.

Referensi

  1. ^Fowler, Martin (2002). Patterns of Enterprise Application Architecture.
  2. ^Armstrong, John N. (2004). Java and Monetary Data.

No related posts.