Dari Java 11 BigDecimal
docs :
Ketika suatu MathContext
objek diberikan dengan pengaturan presisi 0 (misalnya, MathContext.UNLIMITED
), operasi aritmatika tepat, seperti halnya metode aritmatika yang tidak mengambil MathContext
objek. (Ini adalah satu-satunya perilaku yang didukung dalam rilis sebelum 5.)
Sebagai akibat wajar dari komputasi hasil yang tepat, pengaturan mode pembulatan MathContext
objek dengan pengaturan presisi 0 tidak digunakan dan dengan demikian tidak relevan. Dalam kasus pembagian, hasil bagi yang tepat dapat memiliki ekspansi desimal yang panjang tak terhingga; misalnya, 1 dibagi 3.
Jika hasil bagi memiliki ekspansi desimal nonterminating dan operasi ditentukan untuk mengembalikan hasil yang tepat, sebuah ArithmeticException
dilemparkan. Kalau tidak, hasil pasti divisi dikembalikan, seperti yang dilakukan untuk operasi lain.
Untuk memperbaikinya, Anda perlu melakukan sesuatu seperti ini :
a.divide(b, 2, RoundingMode.HALF_UP)
di mana 2 adalah skala dan RoundingMode.HALF_UP adalah mode pembulatan
Untuk lebih jelasnya lihat posting blog ini .
precision
; ituscale
. Silakan lihat docs.oracle.com/javase/7/docs/api/java/math/…Karena Anda tidak menentukan presisi dan mode pembulatan. BigDecimal mengeluh bahwa itu dapat menggunakan 10, 20, 5000, atau tempat desimal tak terhingga, dan itu masih tidak akan dapat memberikan Anda representasi yang tepat dari angka tersebut. Jadi, bukannya memberi Anda BigDecimal yang salah, itu hanya membuat Anda kesal.
Namun, jika Anda menyediakan RoundingMode dan presisi, maka itu akan dapat mengkonversi (mis. 1.333333333-hingga-infinity ke sesuatu seperti 1,3333 ... tetapi Anda sebagai programmer perlu memberi tahu itu presisi yang Anda senangi dengan '
sumber
Anda dapat melakukan
Anda dapat memilih jumlah bit yang Anda inginkan, 32,64.128.
Lihat tautan ini:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
sumber
Untuk memperbaiki masalah seperti itu saya telah menggunakan kode di bawah ini
2 presisi. Sekarang masalah terselesaikan.
sumber
precision
; ituscale
. Silakan lihat docs.oracle.com/javase/7/docs/api/java/math/…Saya memiliki masalah yang sama, karena baris kode saya adalah:
Saya mengubah ini, membaca Jawaban sebelumnya, karena saya tidak menulis ketepatan desimal:
4 adalah Precimal Precison
DAN RoundingMode adalah konstanta Enum, Anda dapat memilih semua ini
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
Dalam Kasus ini HALF_UP, akan memiliki hasil ini:
Anda dapat memeriksa
RoundingMode
informasinya di sini: http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/sumber
Ini masalah pembulatan hasil, solusi bagi saya adalah sebagai berikut.
sumber
Jawaban untuk BigDecimal melempar ArithmeticException
Tambahkan objek MathContext dalam pemanggilan metode membagi Anda dan sesuaikan mode presisi dan pembulatan. Ini akan memperbaiki masalah Anda
sumber
Program Anda tidak tahu presisi apa untuk angka desimal yang digunakan sehingga ia melempar:
Solusi untuk memotong pengecualian:
sumber