2011-07-28 24 views
5

Tôi đã xem qua các chương trình sau đâyGiải thích về sản phẩm của một chương trình java

class Boolean { 
    public static void main(String argv[]) { 
    boolean x; 
    x = 4.4f == 4.4; 
    System.out.println(x); 
    } 
} 

Đầu ra của chương trình sau đây là false

Nhưng nếu chúng ta viết chương trình trong thời trang sau, sau đó

class Boolean { 
    public static void main(String argv[]) { 
     boolean x; 
     x = 4.5f == 4.5; 
     System.out.println(x); 
    } 
} 

Trong trường hợp này, đầu ra là true

Ai đó có thể giải thích cho tôi tại sao ??

+3

có thể trùng lặp của [Có gì sai khi sử dụng == để so sánh nổi trong Java?] (Http://stackoverflow.com/questions/1088216/whats-wrong-with-using-to-compare-floats-in-java) –

+0

Các câu hỏi tương tự khác: [1] (http://stackoverflow.com/questions/2896013), [2] (http://stackoverflow.com/questions/6837007) –

Trả lời

3

Bạn thường không nên so sánh các giá trị dấu phẩy động với toán tử ==. Bạn nên sử dụng 'đóng đủ' so sánh như kiểm tra nếu giá trị khác nhau của một số giá trị nhỏ:

double epsilon = 0.000001

boolean equal = Math.abs(value1-value2) < epsilon

Trong ví dụ của bạn, 4.4f không bằng 4.4, vì java mặc định các giá trị dấu phẩy động là double type, là 64bit, và so sánh chúng với các phôi Java 4.4f để tăng gấp đôi, khiến nó hơi khác so với giá trị ban đầu 4.4 (do các vấn đề biểu diễn phân số thập phân với nhị phân).

Đây là một số link tốt trên số dấu phẩy động.

0

Đó là do lỗi làm tròn khi số đôi bị cắt bớt thành phao. Đôi khi bạn nhận được nó đôi khi bạn sẽ không.

4.4f là phao và 4.4 là số tăng gấp đôi.

1

Vấn đề là các máy tính như số phải dựa trên cơ sở 2 và không phải là cơ sở 10 giống như chúng tôi.

4.4 là một phần vô hạn (như 0.333333333 ... đối với chúng tôi) ở dạng nhị phân, và phao có ít chữ số hơn gấp đôi, vì vậy có ít chữ số hơn 4.4f so với 4.4 làm cho chúng khác nhau.

4.5 không phải là một phần vô hạn.

Lưu ý: Bất cứ khi nào bạn cần so sánh phao hoặc đôi bạn nên luôn kiểm tra kích thước của sự khác biệt, không chỉ kiểm tra sự bình đẳng.

0

Sơ đồ của bạn so sánh phao 16 bit với giá trị kép 32 bit. Quốc tế nó được đại diện cho một IEEE754 do đó sự khác biệt là một lỗi làm tròn dẫn trong một số trường hợp bất đẳng thức này do độ chính xác khác nhau.

0

Đây là thực tế là một phao không phải là một đôi và bạn không thể dễ dàng so sánh trực tiếp, bởi vì một phao chỉ là một xấp xỉ. Hãy xem mã sau:

public static void main(String args[]) { 
    double a, b; 

    a = 4.4f; 
    b = 4.5f; 
    System.out.println("4.4f implicitly cast to a double = "+a); 
    System.out.println("4.5f implicitly cast to a double = "+b); 

    } 

Bạn sẽ thấy rằng 4,4f, khi ẩn hoàn toàn là gấp đôi thực tế là 4.400000095367432.

1

Chạy đoạn mã này để xem cách đúc của phao để tác phẩm gấp đôi cho những trường hợp này

NumberFormat nf = new DecimalFormat("0.00000000000000000000"); 

    System.out.println(nf.format(4.4f)); 
    System.out.println(nf.format(4.4)); 

    System.out.println(nf.format(4.5f)); 
    System.out.println(nf.format(4.5)); 
0

Ngoài những gì mọi người đã nói, đây là một ví dụ rất phổ biến để chứng minh điều này với các hoạt động điểm nổi.

System.out.println(0.3 - 0.2 - 0.1); 

Nó sẽ không in 0. Trong thực tế, nó sẽ in một số rất nhỏ như là kết quả của các lỗi cắt ngắn xảy ra trong các hoạt động điểm nổi khi các phân số nhất định không kết thúc lặp lại trong biểu diễn nhị phân.

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