Pembulatan BigDecimal ke * selalu * memiliki dua tempat desimal

217

Saya mencoba membulatkan nilai BigDecimal ke atas, ke dua tempat desimal.

saya menggunakan

BigDecimal rounded = value.round(new MathContext(2, RoundingMode.CEILING));
logger.trace("rounded {} to {}", value, rounded);

tetapi tidak melakukan apa yang saya inginkan secara konsisten:

rounded 0.819 to 0.82
rounded 1.092 to 1.1
rounded 1.365 to 1.4 // should be 1.37
rounded 2.730 to 2.8 // should be 2.74
rounded 0.819 to 0.82

Saya tidak peduli dengan angka yang signifikan, saya hanya ingin dua tempat desimal. Bagaimana saya melakukan ini dengan BigDecimal? Atau ada kelas / perpustakaan lain yang lebih cocok untuk ini?

Brad Mace
sumber
9
Jika Anda benar-benar ingin membulatkan, Anda akan menggunakan RoundingMode.HALF_UP
Gilbert Le Blanc

Jawaban:

401
value = value.setScale(2, RoundingMode.CEILING)
Louis Wasserman
sumber
19
Itu memang bekerja seperti yang saya inginkan. Apakah perbedaannya hanya yang round()bekerja dengan angka signifikan sementara setScalebekerja dengan jumlah desimal tetap atau ada lebih dari itu?
Brad Mace
44
Gunakan RoundingMode.HALF_UP untuk melakukan "typcal rounding". Yaitu 1,111 memberi 1,11 [CEILING memberi 1,12]
Grzegorz Dev
5
Terima kasih untuk RoundingMode.HALF_UP. Sesuai dokumentasi itu adalah metode pembulatan yang biasa diajarkan di sekolah - apa yang saya butuhkan.
perak
1
Berhati-hatilah jika nilai Anda bisa negatif seperti dalam aplikasi akuntansi. Anda mungkin perlu menggunakan RoundingMode.UP bukan CEILING
Dale
1
Kenapa setScale(...)berhasil? lihat BigDecimal setScale dan bulat .
Jason Law