Câu trả lời:
Bạn có thể sử dụng setScale()
để giảm số lượng chữ số phân số xuống 0. Giả sử value
giữ giá trị được làm tròn:
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
Việc sử dụng round()
có liên quan nhiều hơn một chút vì nó yêu cầu bạn chỉ định số chữ số được giữ lại. Trong các ví dụ của bạn, giá trị này sẽ là 3, nhưng điều này không hợp lệ cho tất cả các giá trị:
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(Lưu ý rằng BigDecimal
các đối tượng là bất biến; cả hai setScale
và round
sẽ trả về một đối tượng mới.)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
in sai
RoundingMode
đó là gì? Đó làBigDecimal
Nếu tôi đi theo câu trả lời của Grodriguez
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Đây là đầu ra
100.23 -> 100
100.77 -> 101
Đó không phải là những gì tôi muốn, vì vậy tôi đã kết thúc việc này ..
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
Đây là những gì tôi nhận được
100.23 -> 100.00
100.77 -> 101.00
Điều này giải quyết vấn đề của tôi bây giờ ..:) Cảm ơn tất cả các bạn.
DecimalFormat
(như trong new DecimalFormat("###.00")
) để quản lý việc chuyển đổi từ BigDecimal
trở lại thành chuỗi. Nó cung cấp "101.00"
kết quả cho cả hai giá trị mà đoạn mã từ @Grodriquez và bạn đã tạo.
Đây là một giải pháp cực kỳ phức tạp, nhưng nó hoạt động:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
Mã kiểm tra:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
Đầu ra:
100
100
101
101
input.toBigInteger().toString().length()
một phần sẽ hiệu quả hơn bằng cách sử dụng một logarit, một số điều nhưround_up(log(input)) + (1 if input is a power of ten, else 0)
Đơn giản chỉ cần nhìn vào:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
và:
setScale(int precision, int roundingMode)
Hoặc nếu sử dụng Java 6, thì
http://download.oracle.com/javase/6/docs/api/java/math/RoundsMode.html#HALF_UP
http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html
và một trong hai:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
Tôi không nghĩ rằng bạn có thể làm tròn nó như vậy chỉ trong một lệnh. Thử
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal("100.12"));
list.add(new BigDecimal("100.44"));
list.add(new BigDecimal("100.50"));
list.add(new BigDecimal("100.75"));
for (BigDecimal bd : list){
System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
}
Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
Tôi đã kiểm tra các ví dụ còn lại của bạn và nó trả về các giá trị mong muốn, nhưng tôi không đảm bảo tính đúng đắn của nó.
Bạn muốn
round(new MathContext(0)); // or perhaps another math context with rounding mode HALF_UP
round
: "Nếu cài đặt độ chính xác là 0 thì không có làm tròn nào diễn ra."