Hasilkan sen dengan BigDecimal

Untuk dapat menulis program Java yang berhubungan dengan keuangan, Anda perlu mengetahui tentang

BigDecimal

kelas dan format numerik. Langkah pertama untuk mengajari Anda kedua topik tersebut adalah membuat

BigDecimal

benda. Kami akan menggunakan

BigDecimal

kelas di

java.math

perpustakaan untuk menyimpan nilai. Anda dapat membuat file

BigDecimal

menolak dengan cara berikut:

Jumlah BigDecimal = BigDecimal baru ("1115.37"); 

Dalam kasus di atas, Stringargumen ke BigDecimalkonstruktor menentukan nilai objek yang dibuat. Nilai "1115.37"mungkin mewakili, misalnya, pembayaran hipotek bulanan dalam dolar, atau saldo buku cek. Untuk menampilkan jumlahnya, Anda dapat menggunakan metode BigDecimalkelas toString():

 System.out.println (jumlah.toString ()); 

Sebuah program yang membuat dan menampilkan BigDecimaljumlah ditunjukkan di bawah ini:

import java.math. *; kelas publik Mortgage {public static void main (String [] args) {BigDecimal payment = new BigDecimal ("1115.37"); System.out.println (pembayaran.toString ()); }}

Output dari program diatas adalah:

1115.37 

Memformat mata uang

Karena kita berurusan dengan uang, alangkah baiknya jika jumlah yang dipegang oleh BigDecimalobjek diformat dengan benar, yang untuk mata uang AS akan menyertakan tanda dolar dan koma sebagai pemisah ribuan. (Untuk mata uang lainnya, silakan lihat bagian Mata Uang Negara Lain di bawah). The NumberFormatkelas, ditemukan di java.textperpustakaan, dapat membuat objek yang sesuai untuk mata uang AS dengan kode berikut:

 NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); 

Perhatikan bahwa Localekelas, yang digunakan sebagai argumen untuk getCurrencyInstance()metode di atas, ditemukan di java.utilperpustakaan.

The NumberFormat's format()metode, yang kita akan menggunakan berikutnya, mengambil ganda atau panjang primitif sebagai argumen, jadi pertama kita akan mengubah BigDecimalobjek menjadi doublemenggunakan BigDecimal' s doubleValue()metode:

double doublePayment = payment.doubleValue (); 

Sekarang kita menggunakan NumberFormat's format()metode untuk membuat String:

 String s = n.format (doublePayment); 

Menempatkan langkah-langkah ini dalam sebuah program, kami kemudian memiliki:

import java.math. *; import java.text. *; import java.util. *; kelas publik Mortgage2 {public static void main (String [] args) {BigDecimal payment = new BigDecimal ("1115.37"); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double doublePayment = payment.doubleValue (); String s = n.format (doublePayment); System.out.println (s); }}

Output dari program diatas adalah:

, 115.37 

Pembaca harus memperhatikan bahwa menciptakan doublenilai melibatkan sedikit kerugian dalam akurasi nilai. Meskipun ketidakakuratan terlalu kecil untuk dilihat dalam contoh artikel ini, ketidakakuratan terlihat dalam jumlah yang sangat besar. Oleh karena itu, Anda tidak dapat mengandalkan NumericFormatuntuk menghasilkan hasil yang akurat dengan angka yang sangat besar (sekitar 13 digit atau lebih).

Mata uang negara lain

Dalam contoh sebelumnya, kami menggunakan Locale.USargumen yang diteruskan ke getCurrencyInstance()metode untuk menentukan mata uang negara (Amerika Serikat) tempat kami akan bekerja. Namun Java tidak terbatas pada penggunaan mata uang AS. Misalnya, Anda akan menggunakan Locale.GERMANY, Locale.FRANCE, atau Locale.ITALYuntuk menentukan mata uang Jerman, Prancis, dan Italia. Topik internasionalisasi merupakan subjek tersendiri; lihat bagian Sumber Daya untuk link ke informasi lebih lanjut.

Operasi BigDecimal

BigDecimalmetode untuk menambah dan mengurangi bilangan adalah add()dan subtract(), masing-masing. Misalnya, untuk menambahkan 1.115.37 dan 115.37, kita dapat melakukan hal berikut:

Saldo BigDecimal = BigDecimal baru ("1115.37"); Transaksi BigDecimal = BigDecimal baru ("115.37"); BigDecimal newBalance = balance.add (transaksi);

The BigDecimal's newBalanceobjek sekarang memegang nilai 1,230.74. Demikian pula, untuk mengurangi 115,37 dari 1.115,37, kita dapat menggunakan kode ini:

Saldo BigDecimal = BigDecimal baru ("1115.37"); Transaksi BigDecimal = BigDecimal baru ("115.37"); BigDecimal newBalance2 = balance.subtract (transaksi);

The BigDecimal's newBalance2objek sekarang memegang nilai 1.000,00. (Secara alami, jika kita berbicara tentang saldo buku cek dalam kehidupan nyata, subtract()metode tersebut akan digunakan lebih sering daripada add()metode, dan jumlah total yang dikurangi dari saldo buku cek akan melebihi jumlah total yang ditambahkan, atau begitulah yang sering terlihat.) Anda dapat mencapai mengalikan dan membagi dengan BigDecimal's multiply()dan divide()metode. Mengalikan ditunjukkan dalam program berikut:

import java.math. *; import java.text. *; import java.util. *; kelas publik Multiply {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); TaxRate BigDecimal = BigDecimal baru ("0,0049"); BigDecimal d2 = d.multiply (taxRate); System.out.println ("Tidak diformat:" + d2.toString ()); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); uang ganda = d2.doubleValue (); String s = n.format (uang); System.out.println ("Diformat:" + s); }}

Output untuk kode di atas ditunjukkan di bawah ini:

Tidak diformat: 5.465068 Diformat: .46 

Perhatikan tempat desimal ekstra dalam BigDecimalobjek yang tidak diformat dibandingkan dengan keluaran yang diformat. Selain itu, memformat nilai BigDecimalobjek menyebabkan pecahan - lebih besar dari satu setengah - dijatuhkan. Untuk mengelola tempat desimal ekstra dan kurangnya pembulatan, kita bisa menggunakan BigDecimal's setScale()metode untuk mengatur jumlah tempat desimal. Saat menggunakan setScale(), kita perlu menentukan tidak hanya jumlah tempat desimal, tetapi bagaimana angka tersebut akan dibulatkan, jika pembulatan diperlukan. Cara yang paling umum untuk pembulatan - membulatkan pecahan setengah atau lebih besar, dan membulatkan semua pecahan lainnya - dapat ditentukan dengan BigDecimalkonstanta ROUND_HALF_UP. Oleh karena itu, untuk mengatur jumlah tempat desimal menjadi dua dan menentukan bahwa pecahan setengah dan lebih besar akan dibulatkan, kita dapat menulis:

d2 = d2.setScale (2, BigDecimal.ROUND_HALF_UP); 

Memodifikasi program di atas untuk ditambahkan setScale(), sekarang kami memiliki:

import java.math. *; import java.text. *; import java.util. *; kelas publik Multiply2 {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); TaxRate BigDecimal = BigDecimal baru ("0,0049"); BigDecimal d2 = d.multiply (taxRate); d2 = d2.setScale (2, BigDecimal.ROUND_HALF_UP); System.out.println ("Tidak diformat:" + d2.toString ()); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); uang ganda = d2.doubleValue (); String s = n.format (uang); System.out.println ("Diformat:" + s); }}

Sekarang hasilnya adalah:

Tidak diformat: 5.47 Diformat: .47 

Sekarang BigDecimalnilainya dibulatkan menjadi dua digit, membulatkan nilai ke atas, dan format yang Stringbenar menampilkan nilai yang dibulatkan. Konstanta lain yang berguna dalam pembulatan adalah ROUND_HALF_DOWNdan ROUND_HALF_EVEN. Yang pertama,, ROUND_HALF_DOWNmembulatkan pecahan dari setengah dan ke bawah ke bawah, dan yang lainnya ke atas. Yang kedua,, ROUND_HALF_EVENmembulatkan setengah pecahan ke bilangan genap (misalnya, 2,5 membulatkan ke 2, sedangkan 3,5 membulatkan ke 4), dan pecahan lebih besar atau kurang dari setengah ke bilangan bulat terdekat. Saat membagi BigDecimalobjek, kita diminta untuk menentukan bagaimana hasilnya akan dibulatkan. Untuk artikel ini, kami akan membulatkan dua bagian. Program berikut menunjukkan beberapa divisi sampel:

import java.math. *; import java.text. *; import java.util. *; kelas publik Bagilah {public static void main (String [] args) {BigDecimal d = new BigDecimal ("1115.32"); Hari BigDecimal = BigDecimal baru ("30"); BigDecimal d2 = d.divide (hari, 2, BigDecimal.ROUND_HALF_UP); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); uang ganda = d2.doubleValue (); String s = n.format (uang); System.out.println (s); }}

Output dari program diatas adalah:

7.18 

Menghitung bunga

Untuk contoh ini, asumsikan bahwa sejumlah, 500 akan menerima pembayaran bunga pada tingkat tahunan 6,7 persen. Pembayaran akan dihitung setiap tiga bulan, dan kami akan menghitung pembayaran triwulanan pertama. Untuk melakukannya, kita akan menggunakan rumus I = PRT , di mana I adalah jumlah bunga, P adalah pokok (9.500), R adalah suku bunga (6,7 persen per tahun), dan T adalah waktu (0,25 tahun). Programnya adalah:

import java.math. *; import java.text. *; import java.util. *; kepentingan kelas publik {public static void main (String [] args) {BigDecimal principal = new BigDecimal ("9500.00"); Tingkat BigDecimal = BigDecimal baru ("0,067"); Waktu BigDecimal = BigDecimal baru ("0,25"); Suhu BigDecimal = principal.multiply (rate); Bunga BigDecimal = temp.multiply (waktu); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); uang ganda = bunga.doubleValue (); String s = n.format (uang); System.out.println ("Bunga kuartal pertama:" + s); }}

Output dari program diatas adalah:

Bunga kuartal pertama: 59,12 

Transaksi reksa dana

Dalam contoh ini, seorang investor memiliki 754.495 saham di reksa dana. Investor melakukan pembelian tambahan 00.00 saham dengan harga 0,38 per saham. Kami akan menggunakan program Java berikut untuk menjawab dua pertanyaan: Berapa banyak saham yang dimiliki investor setelah pembelian, dan berapa nilai pasar akun saat ini setelah pembelian? Kami akan mengasumsikan bahwa reksa dana melacak nomor saham ke tiga tempat desimal:

import java.math. *; import java.text. *; import java.util. *; kelas publik Reksa {public static void main (String [] args) {BigDecimal share = new BigDecimal ("754.495"); BigDecimal purchaseAmount = BigDecimal baru ("200.00"); BigDecimal pricePerShare = new BigDecimal ("10.38"); BigDecimal sharePurchased = purchaseAmount.divide (pricePerShare, 3, BigDecimal.ROUND_HALF_UP); saham = saham.add (sharePurchased); BigDecimal accountValue = share.multiply (pricePerShare); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double dAccountValue = accountValue.doubleValue (); String sAccountValue = n.format (dAccountValue); System.out.println ("Jumlah saham =" + saham.toString ()); System.out.println ("Nilai akun =" + sAccountValue); }}

Keluaran program di atas:

Jumlah saham = 773.763 Nilai akun =, 031.66 

Lebih banyak pemformatan

Dalam contoh di atas, jumlah saham kurang dari 1.000. Jika lebih besar dari 1.000, program akan mengeluarkan angka tanpa koma untuk memisahkan tempat ribuan dari digit lainnya. Kita dapat membuat NumberFormatobjek untuk memformat angka dalam gaya AS (dipisahkan koma ribuan, titik desimal terpisah) dengan menggunakan:

NumberFormat n2 = NumberFormat.getInstance (Locale.US); 

Memodifikasi program sebelumnya untuk meningkatkan jumlah saham menjadi lebih dari 1.000 dan untuk menampilkan jumlah saham yang diformat sesuai keinginan, kami memiliki:

import java.math. *; import java.text. *; import java.util. *; kelas publik Mutual2 {public static void main (String [] args) {BigDecimal share = new BigDecimal ("1754.495"); BigDecimal purchaseAmount = BigDecimal baru ("2000.00"); BigDecimal pricePerShare = new BigDecimal ("10.38"); BigDecimal sharePurchased = purchaseAmount.divide (pricePerShare, 3, BigDecimal.ROUND_HALF_UP); saham = saham.add (sharePurchased); BigDecimal accountValue = share.multiply (pricePerShare); NumberFormat n = NumberFormat.getCurrencyInstance (Locale.US); double dAccountValue = accountValue.doubleValue (); String sAccountValue = n.format (dAccountValue); NumberFormat n2 = NumberFormat.getInstance (Locale.US); double dShares = share.doubleValue (); String sShares = n2.format (dShares); System.out.println ("Jumlah saham =" + sShares);System.out.println ("Nilai akun =" + sAccountValue); }}

Versi yang dimodifikasi (langsung di atas) sekarang menampilkan:

Jumlah saham = 1.947.173 Nilai akun = 0,211.66 

Peringatan

Jika Anda menulis program yang akan diandalkan oleh Anda atau orang lain untuk perhitungan keuangan, masuk akal untuk berhati-hati. Pertama, uji program Anda secara menyeluruh. Kedua, konsultasikan dengan profesional, seperti akuntan, jika Anda ragu dengan formula yang benar, aturan pembulatan, atau aspek moneter lainnya.

Menyimpulkan

BigDecimalobjek, yang mewakili nilai, dapat ditambahkan, dikurangi, dikalikan, dan dibagi. Meskipun Anda dapat menampilkan BigDecimalobjek menggunakan toString()metode ini, sering kali lebih disukai untuk membuat NumberFormatobjek dengan format yang doublesdiperoleh BigDecimal. Sekarang Anda dapat menambahkan nilai dari membuat perhitungan bunga sederhana dan transaksi reksa dana di program Java Anda.

Robert Nielsen adalah Programmer Java 2 Bersertifikat Sun. Dia memegang gelar master dalam pendidikan, dengan spesialisasi dalam pengajaran dengan bantuan komputer, dan telah mengajar di bidang komputer selama beberapa tahun. Dia juga menerbitkan artikel terkait komputer di berbagai majalah.