2012-04-09 37 views
10

tôi đã cố gắng BigDecimal.valueOf(Double.POSITIVE_INFINITY), nhưng vẫn giữ nhận NumberFormatExceptionLàm thế nào để chuyển đổi Double.POSITIVE_INFINITY sang BigDecimal?

Cảm ơn

+7

'BigDecimal infinity = BigDecimal.ZERO; for (;;) infinity = infinity.add (BigDecimal.ONE); ' – Jeffrey

+0

Giải pháp tốt nhất mà tôi có thể nghĩ đến là triển khai một lớp con của BigDecimal có khả năng này, nếu bạn cần các tính năng của cả BigDecimal và Infinity. –

Trả lời

14

Hành vi này tương ứng với documented cách phương pháp valueOf là nghĩa vụ phải làm việc:

Tham số: val - đôi để chuyển đổi sang một BigDecimal.

Trả về: một BigDecimal có giá trị bằng hoặc xấp xỉ bằng giá trị của val.

Ném: NumberFormatException - nếu val là vô hạn hoặc NaN.

15

Bạn không thể đại diện cho vô cực trong BigDecimal.

0

Bạn không thể chỉ đơn giản là lấy được một lớp con từ BigDecimal để hỗ trợ NaN và Infinite. Khi sinh ra một lớp con, các hàm tạo của cha mẹ phải được thực hiện. Và hàm tạo cha mẹ phải được gọi đầu tiên trong hàm tạo con. BigDecimal có một số nhà thầu, ví dụ: BigDecimal (double val). Tuy nhiên, như tài liệu JAVA chỉ ra, đôi val không nên là NaN hoặc vô hạn. Nếu không, một NumberFormatException ném. Nếu bạn mở rộng BigDecimal thành MyBigDecimal, tôi nghĩ bạn cũng cần một hàm tạo tương tự là MyBigDecimal (double val). Vấn đề là, MyBigDecimal (double val) phải gọi super (val) là câu lệnh đầu tiên (yêu cầu Java). Bạn không thể thêm một cái gì đó như nếu (val == Double.NaN) hoặc cố gắng bắt trước khi siêu (val). Vì vậy, các MyBigDecimal (double val) chức năng có được như:

public MyBigDecimal(double val) { 
    super(val); 
    ... 
} 

Như vậy không có cách nào để thiết lập val để Double.NaN hoặc Infinite vì kết quả này trong NumberFormatException anyway.

Rất tiếc, BigDecimal là một lớp chỉ đọc, tức là bạn không có cách nào để đặt lại giá trị bằng cách sử dụng hàm như setValue (...). Vì vậy, bạn không bao giờ có thể gán NaN hoặc vô hạn cho một lớp mở rộng BigDecimal.

Giải pháp duy nhất là sử dụng một wrapper, ví dụ:

class MyBigDecimal { 
    public BigDecimal mbigDecNormalValue; 
    public double mdNaNOrInf; 
    ... 

rõ ràng, điều này sẽ không phải là một thực hiện rất đơn giản.

Khá lạ khi Oracle không hỗ trợ NaD BigDecimal hoặc vô hạn trong JAVA 7. Nhưng tôi tin rằng BigDecimal cuối cùng sẽ hỗ trợ các giá trị này. Tôi sẽ đề nghị không liên lạc NaN hoặc vô hạn khi bạn sử dụng BigDecimal tại thời điểm này. Nếu không sau khi NaN và vô hạn được hỗ trợ, người dùng định nghĩa MyBigDecimal có thể xung đột với các giao diện BigDecimal mới và chắc chắn gây ra khá nhiều mã hóa trên không

Các vấn đề liên quan