2012-05-24 44 views
25

Tôi muốn đặt tỷ lệ của hai số BigDecimal ab. như trong ví dụ này:Làm tròn số cần thiết với số BigDecimal

BigDecimal a = new BigDecimal("2.6E-1095"); 
     BigDecimal b = new BigDecimal("2.7E-1105"); 
     int i = 112, j=1; 

     BigDecimal aa = a.setScale(i+j); 
     BigDecimal bb = b.setScale(i+j); 

và khi tôi chạy tôi có ngoại lệ này:

java.lang.ArithmeticException: Rounding necessary 
    at java.math.BigDecimal.divideAndRound(BigDecimal.java:1439) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2394) 
    at java.math.BigDecimal.setScale(BigDecimal.java:2437) 

Tại sao làm tròn là cần thiết? nếu tôi không muốn thực hiện xung quanh, giải pháp là gì?

Cảm ơn

+0

Trên thực tế nó là một sự ngạc nhiên. Mà không cần nhìn vào tài liệu tôi mong muốn thiết lập quy mô để cắt ngắn ở quy mô ... –

Trả lời

26

Bạn có hai số BigDecimal cả hai số đều yêu cầu trên 1000 chữ số thập phân. Cố gắng thiết lập tỷ lệ chỉ có 113 chữ số thập phân có nghĩa là bạn sẽ mất độ chính xác và do đó bạn cần phải làm tròn.

Bạn có thể sử dụng các phương thức setScale lấy một RoundingMode để ngăn chặn ngoại lệ nhưng không làm tròn.

4

Làm tròn là cần thiết.

Trong javadoc for BigDecimal, nó nói BigDecimal được biểu diễn dưới dạng (unscaledValue × 10 -scale), nơi unscaledValue là một số nguyên arbitatrily dài và quy mô là một 32-bit số nguyên.

2.6 * 10 -1095 yêu cầu tỷ lệ ít nhất 1096 để thể hiện chính xác. Nó không thể được biểu diễn chính xác với (bất kỳ số nguyên nào) * 10 -113. Do đó, bạn cần cung cấp roundingMode.

5

Hãy thử sử dụng phương thức roudingMode của phương thức setScale.

Một số điều như:

BigDecimal aa = a.setScale(i+j, BigDecimal.ROUND_HALF_DOWN); 
Các vấn đề liên quan