Home » » Dasar Class BigDecimal Pada Aplikasi Bisnis

Dasar Class BigDecimal Pada Aplikasi Bisnis

Setelah sebelumnya anda mengetahui mengenai class BigInteger, maka kali ini kita akan membahas mengenai class Big Decimal. Kedua class tersebut adalah immutable.

BigDecimal digunakan untuk perhitungan presisi perhitungan aritmatika yang tinggi. Class ini hampir bisa dikatakan masuk ke dalam tipe class wrapper, namun memiliki berbagai method yang sangat berguna.

Class ini memiliki method seperti ketika anda melakukan operasi aritmatika dengan tipe-tipe primitif. Hanya saja, jika pada tipe primitif anda menggunakan operator matematika seperti +, -, /, -, %, maka pada class BigDecimal atau BigInteger anda menggunakan method seperti add, substract, multiply dan sebagainya

Disini anda menukar kecepatan dengan akurasi.

Anda bisa menggunakan BigDecimal untuk perhitungan misalnya dalam hal keuangan yang memang membutuhkan presisi yang tinggi.

Ketika anda menggunakan Java untuk perhitungan bisnis aritmatika secara sederhana, mungkin anda bisa terkejut karena Java tidak selalu memberikan jawaban yang benar. Misalnya ketika tipe double digunakan untuk perhitungan invoice keuangan, ekspresi aritmatika mungkin tidak memberikan akurasi yang tepat.



Alasan sebenarnya adalah angka floating-point tidak bisa merepresentasikan semua desimal dengan akurasi yang diperlukan. Kemudian ketika anda melakukan pembulatan menjadi dua angka dibelakang koma, maka ini bisa terjadi error.

Baca juga:
Class NumberFormat
Class BigInteger
Class DecimalFormat

Masalah Pada Angka Desimal  Dan Pembulatan


Perhatikan contoh program invoice di bawah ini, di mana ketika tipe data double yang digunakan tidak memberikan hasil yang akurat untuk perhitungan keuangan. Pajak penjualan adalah 5% atau 0.05 dari harga barang dan jika nilai pembelian di atas $100 maka akan mendapatkan diskon 10 % atau 0.1 dari harga barang.

Contoh output:

Bisa dilihat dari contoh output di atas, ketika user memasukkan subtotal 150.50, program memberikan hasil yang tepat.

Namun, masalah terjadi ketika user memasukkan subtotal 100.05, total sebelum pajak adalah $90.04 padahal seharusnya $90.05. Demikian juga ketika user memasukkan subtotal 0.7, program memberikan hasil pajak penjualan $0.03, dan seharusnya subtotal menjadi $0.73, tetapi program memberikan hasil $0.74.

Jadi apa masalah yang terjadi di sini? Apakah program tidak berjalan dengan semestinya?

belajar_java_dasar_class_big_decimal


Perhatikan pada nilai yang yang dimasukkan user yaitu 100.05, dari sini anda dapat dengan mudah mengetahui penyebabnya. Ini dikarenakan bagaimana NumberFormat bekerja, jumlah diskon $10.005 dan juga total sebelum pajak $90.045 tidak dibulatkan ke atas.

Pada output program terlihat bahwa total sebelum pajak adalah $90.04 dan pajak penjualan $4.50, dan subtotal $94.55. Seperti terlihat program ini tidak menjumlahkan dengan benar.

Dari sini anda bisa mengetahui bahwa sebenarnya program berjalan sebagaimana mestinya, walaupun memberikan hasil yang tidak diinginkan.

Sekarang coba lihat juga pada nilai 0.70 yang dimasukan user, seharusnya pajak penjualan adalah $0.035 namun output menunjukkan $0.03, ini terjadi karena angka floating-point tidak merepresentasikan dengan tepat untuk beberapa fraksi desimal.

Sebagai hasilnya, nilai yang diformat $0.03 seharusnya dibulatkan menjadi $0.04. Namun, total invoice yang ditunjukkan adalah benar di $0.74. Wow, jadi sepertinya program ini tidak bisa menghitung ya? Lihat juga jika dihitung berdasarkan jumlah jumlah masing-masing subtotal yang ditampilkan, harusnya total invoice adalah $237.51, namun outpout adalah $237.50.

Meskipun error seperti ini bisa diterima dalam kebanyakan aplikasi, namun ini tidak akan bisa diterima dalam aplikasi bisnis. Dan untuk aplikasi seperti ini, anda perlu untuk menyediakan pemecahan masalah untuk dapat memberikan hasil yang anda inginkan. Coba bayangkan bagaimana jadinya jika menggunakan program invoice yang tidak bisa melakukan pembulatan ke atas.

Salah satu solusi mungkin adalah dengan menulis kode tanpa pembulatan sehingga anda tidak memerlukan class NumberFormat untuk melakukan pembulatan tersebut. Namun, faktanya beberapa fraksi desimal tidak dapat secara akurat direpresentasikan oleh angka floating-point.

Jadi untuk memecahkan masalah tersebut juga pada data yang lainnya, solusi terbaik adalah menggunakan class BigDecimal.

Menggunakan BigDecimal

Class BigDecimal didesain untuk mengatasi 2 masalah, yaitu:

  • Untuk merepresentasikan angka desimal dengan tepat.
  • Digunakan untuk bekerja dengan angka yang memiliki lebih dari 16 digit signifikan.

Jika anda belum pernah menggunakan class ini sebelumnya, sebaiknya dipelajari dan diperdalam, karena class ini banyak dipakai dalam aplikasi bisnis.

Setelah anda membuat objek BigDecimal, maka anda bisa menggunakan method pada objek tersebut.

Beberapa method yang sering digunakan adalah:

  • add(value)
  • compareTo(value)
  • divide(value, scale, rounding-mode)
  • setScale(scale, rounding-mode)
  • substract(value)
  • toString()

Method toString() akan mengkonversi nilai dari objek BigDecimal menjadi sebuah string. Anda dapat menggunakan method compareTo() untuk membandingkan nilai dalam objek BigDecimal.

Method setScale() juga sangat penting karena digunakan untuk menentukan junmlah dari angka desimal dari sebuah nilai dari objek BigDecimal sebagaimana juga digunakan dalam mode pembulatan.

Contoh mengatur desimal menjadi dua angka:

pajakPenjualan = pajakPenjualan.setScale (2, RoundingMode.HALF_UP);
dalam hal ini RoundingMode adalah enumerasi. Aplikasi bisnis kebanyakan menggunakan HALF_UP untuk mode pembulatannya. Namun, sebelum bisa menggunakannya, anda harus meng-importnya terlebih dahulu.

Berikut ini adalah contoh program invoice yang menggunakan BigDecimal:


Output:



Dari kedua ouput tersebut di atas anda bisa membandingkan ketika tanpa menggunakan BigDecimal dan setelah menggunakannya.

Dengan kode yang baru ini, semua nilai hasil disimpan dalam objek BigDecimal dan semua hasil memiliki dua angka desimal dan pembulatan telah dilakukan dengan benar ketika dibutuhkan.

Ketika hasil dikalkulasi, anda dapat menggunakan method NumberFormat untuk melakukan format pada nilai dalam objek BigDecimal tersebut tanpa perlu merasa khawatir dengan masalah pada pembulatan. Tapi, method dari objek NumberFormat hanya membatasi hasil sampai 16 digit signifikan saja.

0 komentar:

Posting Komentar