Apa perbedaan antara dua panggilan ini? (Apakah ada?)
// 1.
new BigDecimal("3.53456").round(new MathContext(4, RoundingMode.HALF_UP));
// 2.
new BigDecimal("3.53456").setScale(4, RoundingMode.HALF_UP);
java
bigdecimal
pengguna
sumber
sumber
round
metode ini juga mengembalikan instance BigDecimal baru karena, seperti yang Anda katakan, instans tidak dapat diubah.Jawaban:
Satu poin penting yang disinggung tetapi tidak langsung ditangani adalah perbedaan antara "presisi" dan "skala" dan bagaimana mereka digunakan dalam dua pernyataan. "presisi" adalah jumlah total angka signifikan dalam suatu angka. "skala" adalah jumlah digit di sebelah kanan titik desimal.
Konstruktor MathContext hanya menerima presisi dan RoundingMode sebagai argumen, dan karenanya skala tidak pernah ditentukan dalam pernyataan pertama.
setScale()
jelas menerima skala sebagai argumen, serta RoundingMode, namun presisi tidak pernah ditentukan dalam pernyataan kedua.Jika Anda memindahkan titik desimal satu tempat ke kanan, perbedaannya akan menjadi jelas:
sumber
Memang ada perbedaan besar, yang harus Anda ingat. setScale benar-benar mengatur skala nomor Anda sedangkan putaran tidak membulatkan angka Anda ke angka yang ditentukan TETAPI "dimulai dari digit paling kiri dari hasil yang tepat" seperti yang disebutkan dalam jdk. Jadi mengenai sampel Anda hasilnya sama, tetapi cobalah 0,0034. Inilah catatan saya tentang itu di blog saya:
http://araklefeistel.blogspot.com/2011/06/javamathbigdecimal-difference-between.html
sumber