2012-01-06 20 views
5

Tôi không biết cách xử lý new BigDecimal("0E30"). Giá trị của nó là 0 nhưng không so sánh với BigDecimal.ZERO. Xem dưới đây:0E30 không phải là ZERO

System.out.println(new BigDecimal("0E30").add(BigDecimal.ONE));  // ---> 1 
System.out.println(new BigDecimal("0E30").equals(BigDecimal.ZERO)); // ---> false 

một người nào đó có thể giúp tôi thực hiện so sánh đúng (Tôi biết tôi có thể nhận được một cách giải quyết bằng cách chuyển đổi các BigDecimal s để double, nhưng tôi muốn biết những gì đang xảy ra)? Tôi đang sử dụng JRE 1.6.3. nhờ

Trả lời

7

Từ docs (nhấn mạnh là của tôi):

So sánh BigDecimal này với đối tượng quy định cho sự bình đẳng. Không giống như compareTo, phương pháp này xem xét hai BigDecimals chỉ bằng chúng là bằng nhau và tỷ lệ (do đó 2.0 không bằng 2.00 khi so với phương pháp này).

Trong trường hợp này, tỷ lệ không khớp với. Vì vậy, thay vào đó, bạn nên sử dụng compareTo().

BigDecimal là một trong những trường hợp equals() không phù hợp với compareTo():

Lưu ý: chăm sóc nên được thực hiện nếu BigDecimals sẽ được sử dụng như phím trong một SortedMap hoặc các yếu tố trong một SortedSet, như tự nhiên của BigDecimal đặt hàng không nhất quán với bằng. Xem Comparable, SortedMap hoặc SortedSet để biết thêm thông tin.

1

Từ the docs:

public boolean equals(Object x) 

    Compares this BigDecimal with the specified Object for equality. 
    Unlike compareTo, this method considers two BigDecimal objects equal 
    only if they are equal in value and scale (thus 2.0 is not equal to 
    2.00 when compared by this method). 

quy mô của bạn là khác nhau. Nếu bạn muốn chúng so sánh như nhau, hãy sử dụng compareTo.

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