2010-05-29 32 views
5

Có ai vui lòng cho tôi biết tại sao đầu ra của chương trình sau không khác biệt "khác nhau" không?Số phao trong Java

public static void main(String[] args) 
{ 

float f1=3.2f; 
float f2=6.5f; 

if(f1==3.2) 
System.out.println("same"); 
else 
System.out.println("different"); 

if(f2==6.5) 
System.out.println("same"); 
else 
System.out.println("different"); 
} 

o/p: khác nhau cùng

+0

tại sao phải như vậy? –

Trả lời

11

6,5 có một đại diện nhị phân hữu hạn: 110.1

Bất kỳ loại nổi với ít nhất 4 bit có ý nghĩa có thể đại diện cho con số này một cách hoàn hảo.

110,100000000000000000000 (float)
= 6,5

110,10000000000000000000000000000000000000000000000000 (đôi)
= 6,5

3,2 Mặt khác có một đại diện vô nhị phân: 101,0011001100110011 ...

float và double không có độ chính xác vô hạn và do đó chỉ có thể ước tính con số này: (

101,001100110011001100110 (float)
= 3,2000000476837158203125

101,00110011001100110011001100110011001100110011001101 (đôi)
= 3,20000000000000017763568394002504646778106689453125

Như bạn có thể thấy rõ, những con số này không giống nhau!

+0

+1 cho bạn vì đó là câu trả lời duy nhất thực sự trả lời câu hỏi được hỏi. Tôi không biết tại sao OP chấp nhận câu trả lời khác mà chắc chắn không giải thích lý do tại sao một thử nghiệm cho * "giống nhau" * và khác * "khác" *. – NoozNooz42

+2

Tôi sẽ chỉ thêm rằng lý do khác cho điều này là Java khuyến khích ít loại chính xác hơn cho các loại chính xác hơn để so sánh, điều này giúp so sánh 3.2 và 3.2f có thể. Nếu nó cắt ngắn loại dài hơn ở đây, chúng sẽ giống nhau, nhưng may thay nó (như C) sử dụng * mở rộng chuyển đổi nguyên thủy * để làm những gì hầu hết mọi người có thể mong đợi: http://bit.ly/d8Yx3N – tgamblin

+0

@ NoozNooz42: Hey , Tôi đã nhận nó cũng đúng (: –

1

This có thể giúp hiểu

3

Vì 3.2f là một giá trị float3.2 là một giá trị double. Các số dấu phẩy động luôn hơi không chính xác vì biểu diễn nhị phân không thể thực hiện chúng một cách chính xác, do đó so sánh chúng với sự bình đẳng chính xác là một ý tưởng tồi. Đặc biệt là so sánh phao với đôi. Các biểu thức như 3.2f == 3.2f thường không sao, nhưng ngay cả những biểu thức có thể không thành công ở một số ngôn ngữ, ví dụ: nếu chúng đại diện cho các số trong sổ đăng ký chính xác hơn trong bộ nhớ.

+0

+1 vì giải thích này kỹ lưỡng hơn nhiều so với việc tôi viết. :) – edl

+0

Tôi nghĩ rằng câu hỏi là tại sao một trong số họ nên so sánh như nhau. OP hy vọng cả hai đều không bằng nhau. –

+3

"Số dấu phẩy động * luôn * hơi không chính xác" -> sai. float và double có thể biểu diễn các phân số với các biểu diễn nhị phân hữu hạn giống như 6.5. Xem câu trả lời của tôi để biết chi tiết. – fredoverflow

0

"3.2f" là loại phao. "3.2" là loại gấp đôi.

0

Ngoài ra, tôi nghĩ bất cứ điều gì với một số thập phân mặc định thành một đôi, vì vậy khi bạn làm một so sánh, bạn phải thêm 'f' cũng như if(f2==6.4f).

5

Vì 3.2 không thể đại diện chính xác như số dấu phẩy động và 6.5 là (gợi ý: 6.5 = 13 * 2^(- 1)), cũng như thực tế là 3.2 là double chữ nhưng 3.2f là float chữ .

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