SetScale dan bulat BigDecimal

140

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);
pengguna
sumber
6
terlepas dari jawaban yang diterima di bawah ini - setScale () menciptakan objek baru BigDecimal - mengingat kelasnya yang tidak berubah
prash
9
@prash roundmetode ini juga mengembalikan instance BigDecimal baru karena, seperti yang Anda katakan, instans tidak dapat diubah.
daiscog

Jawaban:

212

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:

// 1.
new BigDecimal("35.3456").round(new MathContext(4, RoundingMode.HALF_UP));
//result = 35.35
// 2.
new BigDecimal("35.3456").setScale(4, RoundingMode.HALF_UP);
// result = 35.3456
Peters dale
sumber
38
Re: "" presisi "adalah jumlah total digit dalam suatu angka." Tidak. Presisi adalah jumlah digit signifikan. Ketepatan 0,000042M adalah 2.
David J.
2
Lihat: "presisi": Hitungan angka dimulai dari angka bukan nol paling kiri dari hasil yang pasti. docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html
Eddy
jika "Presisi adalah jumlah digit signifikan" daripada mengapa presisi 0,0000009 muncul sebagai 2? seharusnya 1
Sanchi Girotra
1
Bagaimana nilai pengaturan BigDecimal Anda? Bagaimana Anda mengeluarkan nilai (menggunakan String.format () mungkin menyembunyikan angka signifikan)?
Peters dale
1
@SanchiGirotra Ketepatannya adalah "jumlah digit dalam nilai yang tidak dihitung". Ketelitian 2 dengan nilai tidak berskala 90 dan skala 8 memberi 0,0000009. Seperti halnya ketelitian 1, nilai tidak berskala 9 dan skala 7.
daiscog
52

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

pengguna817756
sumber