Làm tròn BigDecimal thành * luôn * có hai chữ số thập phân


217

Tôi đang cố gắng làm tròn các giá trị BigDecimal lên đến hai chữ số thập phân.

Tôi đang sử dụng

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

nhưng nó không làm những gì tôi muốn một cách nhất quán:

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

Tôi không quan tâm đến các chữ số có nghĩa, tôi chỉ muốn hai chữ số thập phân. Làm cách nào để làm điều này với BigDecimal? Hoặc có một lớp học / thư viện khác phù hợp hơn với điều này?


9
Nếu bạn thực sự muốn làm tròn, bạn sẽ sử dụng RoundingMode.HALF_UP
Gilbert Le Blanc

Câu trả lời:


401
value = value.setScale(2, RoundingMode.CEILING)

19
Điều đó thực sự làm việc như tôi muốn. Là sự khác biệt đơn giản là round()hoạt động với các chữ số có nghĩa trong khi setScalehoạt động với một số thập phân cố định hoặc có nhiều hơn cho nó?
Brad Mace

44
Sử dụng RoundingMode.HALF_UP để thực hiện "làm tròn kiểu chữ". Đó là 1.11 cho 1.11 [CEILING cho 1.12]
Grzegorz Dev

5
Cảm ơn vì RoundingMode.HALF_UP. Theo tài liệu, đây là phương pháp làm tròn thường được dạy trong trường học - điều tôi cần.
bạc

1
Hãy cẩn thận nếu giá trị của bạn có thể âm như trong một ứng dụng kế toán. Bạn có thể cần sử dụng RoundingMode.UP thay vì CEILING
Dale

1
Tại sao setScale(...)làm việc? xem BigDecimal setScale và vòng .
Luật Jason
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.