Saya memahami bahwa BigDecimal direkomendasikan sebagai praktik terbaik untuk merepresentasikan nilai moneter di Jawa. Apa yang kamu gunakan? Apakah ada perpustakaan yang lebih baik yang lebih Anda pilih untuk digunakan?
Saya memahami bahwa BigDecimal direkomendasikan sebagai praktik terbaik untuk merepresentasikan nilai moneter di Jawa. Apa yang kamu gunakan? Apakah ada perpustakaan yang lebih baik yang lebih Anda pilih untuk digunakan?
Jawaban:
BigDecimal
sepanjang perjalanan. Saya pernah mendengar tentang beberapa orang yang membuat kelas Cash
atau mereka sendiri Money
yang merangkum nilai tunai dengan mata uang, tetapi di baliknya itu masih BigDecimal
, mungkin dengan BigDecimal.ROUND_HALF_EVEN
pembulatan.
Sunting: Seperti yang Don sebutkan dalam jawabannya , ada proyek bersumber terbuka seperti waktu dan uang, dan sementara saya memuji mereka karena mencoba mencegah pengembang dari keharusan menemukan kembali roda, saya hanya tidak cukup percaya pada perpustakaan pra-alfa untuk digunakan itu dalam lingkungan produksi. Selain itu, jika Anda menggali di bawah kap mesin, Anda akan melihat mereka BigDecimal
juga menggunakannya .
Mungkin bermanfaat bagi orang yang tiba di sini melalui mesin telusur untuk mengetahui tentang JodaMoney: http://www.joda.org/joda-money/ .
BigDecimal
di balik tenda!
Saya tidak mengungkapkan pendapat saya di sini, tetapi ada argumen yang cukup bagus terhadap BigDecimal yang mungkin harus dikeluarkan seseorang:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
Perpustakaan yang nyaman yang saya temui sebelumnya adalah perpustakaan Joda-Money . Salah satu implementasinya memang berdasarkan BigDecimal. Ini didasarkan pada spesifikasi ISO-4217 untuk mata uang dan dapat mendukung daftar mata uang yang disesuaikan (dimuat melalui CVS).
Pustaka ini memiliki sejumlah kecil file yang dapat dengan cepat melalui modifikasi jika diperlukan. Joda-Money diterbitkan di bawah lisensi Apache 2.0.
Jika Anda hanya menggunakan dolar dan sen, saya akan menggunakan long (diimbangi dengan 2 tempat desimal). Jika Anda membutuhkan lebih banyak detail, desimal besar mungkin bisa menjadi cara yang tepat.
Either way, saya mungkin akan memperluas kelas untuk memiliki .toString () yang menggunakan format yang benar, dan sebagai tempat untuk meletakkan metode lain yang mungkin muncul (Untuk waktu yang lama, mengalikan dan membagi akan kacau jika desimal tidak disesuaikan)
Selain itu, jika Anda menggunakan define kelas dan antarmuka Anda sendiri, maka Anda dapat mengganti implementasi sesuka Anda.
BigDecimal
atau representasi titik tetap lainnya adalah apa yang umumnya dibutuhkan untuk uang.
Representasi dan kalkulasi floating point ( Double
, Float
) tidak tepat, yang menyebabkan hasil yang salah.
Anda harus sangat berhati-hati saat berurusan dengan waktu dan uang.
Ketika Anda bekerja dengan uang, saya harap semua orang tahu untuk tidak pernah menggunakan pelampung atau ganda.
Tapi saya tidak yakin tentang BigDecimal.
Dalam kebanyakan kasus, Anda akan baik-baik saja jika Anda hanya melacak sen dalam int atau long. Dengan cara ini Anda tidak pernah berurusan dengan tempat desimal.
Anda hanya menampilkan dolar saat mencetaknya. Selalu bekerja dengan sen internal menggunakan bilangan bulat. Ini mungkin sulit jika perlu membagi atau perlu menggunakan Math.abs ().
Namun, Anda mungkin peduli setengah sen, atau bahkan seperseratus sen. Saya tidak tahu cara apa yang baik untuk melakukan ini. Anda mungkin hanya perlu berurusan dengan seperseribu sen dan menggunakan jangka panjang. Atau mungkin Anda akan terpaksa menggunakan BigDecimal
Saya akan membaca lebih banyak tentang ini, tetapi abaikan semua orang yang mulai berbicara tentang menggunakan pelampung atau ganda untuk mewakili uang. Mereka hanya mencari masalah.
Saya merasa saran saya belum lengkap, jadi mohon lebih dipikirkan. Anda berurusan dengan tipe berbahaya!
Membuat kelas Uang adalah caranya. Menggunakan BigDecimal (atau bahkan int) di bawahnya. Kemudian menggunakan kelas Mata uang untuk mendefinisikan konvensi pembulatan.
Sayangnya tanpa operator overloading Java membuatnya sangat tidak menyenangkan membuat tipe dasar seperti itu.
Ada perpustakaan yang lebih baik, waktu dan uang . IMO, jauh lebih unggul dari pustaka yang disediakan oleh JDK untuk mewakili 2 konsep ini.
Jelas bukan BigDecimal. Ada begitu banyak aturan khusus untuk pembulatan dan presentasi yang harus Anda khawatirkan.
Martin Fowler merekomendasikan penerapan kelas Uang khusus untuk mewakili jumlah mata uang, dan itu juga menerapkan aturan untuk konversi mata uang.
Hei, inilah artikel yang sangat menarik di BigDecimal, dan contoh ilustrasi mengapa terkadang digunakan sebagai pengganti ganda. Tutorial BigDecimal .
Anda dapat menggunakan kelas DecimalFormat saat pada akhirnya menampilkan nilai mata uang. Ini memberikan dukungan pelokalan dan cukup dapat diperluas.
Saya akan merangkum BigDecimal dalam kelas Uang yang juga memiliki mata uang seperti yang disebutkan di atas. Yang penting adalah Anda melakukan tes unit yang ekstrim dan terutama jika bekerja dengan mata uang yang berbeda. Ada baiknya juga jika Anda menambahkan konstruktor konvinien yang menggunakan string atau metode pabrik yang melakukan hal yang sama sehingga Anda dapat menulis pengujian seperti ini:
assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
Selalu ada kendala dan hal spesifik yang terlibat. Siapa pun yang tidak memiliki pengalaman yang memadai untuk memahami masalah halus yang diuraikan dalam artikel berikut harus mempertimbangkan kembali secara serius sebelum berurusan dengan data keuangan dunia nyata:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimal bukanlah satu-satunya representasi yang benar atau satu-satunya bagian dari teka-teki. Mengingat kondisi tertentu, menggunakan kelas Uang yang didukung oleh sen yang disimpan sebagai bilangan bulat bisa mencukupi dan akan jauh lebih cepat daripada BigDecimal. Ya, itu menyiratkan penggunaan dolar sebagai mata uang dan jumlah batas, tetapi batasan seperti itu dapat diterima dengan baik untuk banyak kasus penggunaan dan semua mata uang memiliki kasus khusus untuk pembulatan dan sub-denominasi, jadi tidak ada solusi "universal".