2012-08-10 28 views
6

Trong Java, chúng ta có thể chuyển đổi int thành float, điều này có thể dẫn đến mất độ chính xác như được hiển thị trong mã ví dụ bên dưới.Java cho phép chuyển đổi ngầm của int sang phao. Tại sao?

public class Test { 
    public static void main(String [] args) { 
     int intVal = 2147483647; 
     System.out.println("integer value is " + intVal); 
     double doubleVal = intVal; 
     System.out.println("double value is " + doubleVal); 
     float floatVal = intVal; 
     System.out.println("float value is " + floatVal); 
     } 
} 

Đầu ra là

integer value is 2147483647 
double value is 2.147483647E9 
float value is 2.14748365E9 

lý do đằng sau cho phép chuyển đổi ngầm của int nổi là gì, khi có một sự mất mát của chính xác?

+0

Bản sao của http://stackoverflow.com/questions/11183980/why-does-c-sharp-allow-an-implicit-conversion-from-long-to-float-when-this-co –

+0

@ AaronKurtzhals: Câu hỏi đó liên quan đến một ngôn ngữ khác. – Wug

Trả lời

6

Bạn có thể tự hỏi:

Tại sao đây là một ngầm chuyển đổi khi có một sự mất mát thông tin? Đây có phải là một chuyển đổi rõ ràng không?

Và tất nhiên bạn có điểm tốt. Nhưng các nhà thiết kế ngôn ngữ đã quyết định rằng nếu loại mục tiêu có phạm vi đủ lớn thì chuyển đổi ngầm được cho phép, mặc dù có thể mất chính xác. Lưu ý rằng đó là phạm vi quan trọng, không phải độ chính xác. Một phao có một phạm vi lớn hơn một int, do đó, nó là một chuyển đổi tiềm ẩn.

Các Java specification nói như sau:

Chuyển đổi mở rộng của một int hoặc một giá trị lâu nổi, hoặc của một giá trị thời gian để tăng gấp đôi, có thể dẫn đến việc mất độ chính xác - đó là, kết quả có thể mất một số bit ít quan trọng nhất của giá trị. Trong trường hợp này, giá trị dấu chấm động kết quả sẽ là một phiên bản được làm tròn chính xác của giá trị số nguyên, sử dụng chế độ vòng tròn gần nhất của IEEE 754.

+0

Bất kỳ ý tưởng nào tại sao 'float' 32 bit được xem là rộng hơn 64-bit 'long'? –

+2

@PeterLawrey: Một phao có phạm vi từ -3.4e + 38 đến 3.4e + 38 (xấp xỉ). Dài có phạm vi từ -9.2e18 đến -9.2e18. Vì phao có phạm vi rộng hơn, nó rộng hơn. –

+0

Thats có lẽ là suy nghĩ. Vấn đề tôi gặp phải là khi bạn chuyển một 'long' thành một phương thức nhận' float' một cách ngẫu nhiên, nó có thể biến 64 bit chính xác thành 24-bit: P –

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