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);

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

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.