2011-11-10 62 views
25

thể trùng lặp:
How to resolve a Java Rounding Double issueLàm thế nào để so sánh hai giá trị kép trong Java?

Một so sánh đơn giản của hai giá trị tăng gấp đôi trong Java tạo ra một số vấn đề. Hãy xem xét đoạn mã đơn giản sau đây trong Java.

package doublecomparision; 

final public class DoubleComparision 
{ 
    public static void main(String[] args) 
    { 
     double a = 1.000001; 
     double b = 0.000001; 

     System.out.println("\n"+((a-b)==1.0)); 
    } 
} 

Đoạn mã trên dường như trở true, đánh giá của biểu thức ((a-b)==1.0) nhưng nó không. Nó trả về false thay vì vì việc đánh giá biểu thức này là 0.9999999999999999 thực tế được mong đợi là 1.0, không bằng 1.0 do đó, điều kiện đánh giá là boolean false. Cách tốt nhất và được đề xuất để vượt qua tình huống như thế nào?

+6

Điều này là do đôi và nổi không thể diễn tả mọi giá trị bằng số. Họ đang thực sự sử dụng xấp xỉ để đại diện cho giá trị. – onit

Trả lời

53

Về cơ bản bạn không nên làm sự so sánh chính xác, bạn nên làm một cái gì đó như thế này:

double a = 1.000001; 
double b = 0.000001; 
double c = a-b; 
if (Math.abs(c-1.0) <= 0.000001) {...} 
+7

Bạn có thể muốn xem xét phương pháp so sánh của Double. Kiểm tra liên kết này: http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

Nhưng nếu bạn sử dụng Double.compare, hãy lưu ý rằng (1) Nếu cả d1 và d2 đều thể hiện Double.NaN, thì phương thức trả về true, mặc dù Double.NaN == Double.NaN có giá trị false; và (2) Nếu d1 đại diện +0.0 trong khi d2 biểu thị -0.0 hoặc ngược lại, phương thức trả về giá trị sai, mặc dù +0.0 == - 0.0 có giá trị đúng. Định nghĩa này cho phép các bảng băm hoạt động đúng. – shiggity

8

Thay vì sử dụng số đôi cho số học thập phân, vui lòng sử dụng java.math.BigDecimal. Nó sẽ tạo ra kết quả mong đợi.

Để tham khảo hãy xem này stackoverflow question

+14

BigDecimal đôi khi không phải là giải pháp khả thi. – mcfinnigan

1

Bạn có thể sử dụng Double.compare; Nó so sánh hai giá trị được chỉ định kép.

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