2012-03-17 39 views
55

Tôi không biết tại sao f hoặc F được đặt sau các giá trị float trong Java hoặc các ngôn ngữ khác? ví dụ:tại sao f được đặt sau giá trị float?

float fVariable = 12.3f; 

bất kỳ tính năng nào khác ngoài việc cho biết đây là giá trị nổi?

+0

Câu hỏi tương tự: [Java: Tại sao bạn cần chỉ định 'f' trong ký hiệu float?] (Http://stackoverflow.com/questions/14102955/java-why-do-you-need-to- xác định-af-in-a-float-literal) –

Trả lời

44

theo mặc định 12.3double đen, Vì vậy, để nói với trình biên dịch để đối xử với nó như float một cách rõ ràng -> nó sử dụng f hoặc F

21

floatdouble chỉ có thể cung cấp giá trị đại diện xấp xỉ đối với một số giá trị. ví dụ. 12,3 hoặc 0,1

Sự khác biệt là phao mà không phải là chính xác (vì nó có độ chính xác ít hơn, vì nó nhỏ hơn)

ví dụ

System.out.println("0.1f == 0.1 is " + (0.1f == 0.1)); 
System.out.println("0.1f is actually " + new BigDecimal(0.1f)); 
System.out.println("0.1 is actually " + new BigDecimal(0.1)); 

in

0.1f == 0.1 is false 
0.1f is actually 0.100000001490116119384765625 
0.1 is actually 0.1000000000000000055511151231257827021181583404541015625 

Vì vậy 0.1 là đại diện gần nhất trong double0.1f là đại diện gần nhất trong float

+0

Tuyệt vời! nhưng cái nào là thực tế (toán học) 0,1 và cái nào bằng với String.valueOf ("0.1")? –

+2

Chỉ BigDecimal là chính xác bằng nhau. Phần còn lại sẽ cung cấp câu trả lời đúng khi chuyển đổi thành một chuỗi nếu được sử dụng đúng cách –

5

phao fVariable = 12,3; Ổn. nhưng khi bạn chỉ sử dụng giá trị float (không có bất kỳ mã định danh nào) trong bất kỳ biểu thức nào mà bạn cần cho trình biên dịch biết rằng giá trị là float, do đó chúng tôi sử dụng hậu tố "f" sau giá trị. ví dụ

float fl = 13f/5f;

tại đây 13 và 5 là giá trị nổi.

39

Thấy rằng chỉ có rất nhiều cách để đại diện cho một số trong chương trình của bạn, các nhà thiết kế Java phải chọn anh đào và gán từng biểu mẫu cho trường hợp sử dụng phổ biến nhất. Đối với những biểu mẫu được chọn làm mặc định, hậu tố biểu thị loại chính xác là tùy chọn.

  • Đối với các chữ số nguyên (int, long), mặc định là int. Vì lý do rõ ràng .
  • Đối với các dấu phẩy động nổi (phao, đôi), mặc định là đôi. Vì sử dụng gấp đôi khả năng cho phép an toàn hơn số học trên các giá trị được lưu trữ .

Vì vậy, khi bạn gõ 12 trong chương trình của bạn, đó là một int theo nghĩa đen, như trái ngược với 12L, mà là một dài. Và khi bạn nhập 12.3, đó là đôi chữ, thay vì 12.3F, là float.

Vậy điều này có liên quan ở đâu? Chủ yếu trong việc xử lý các chương trình giảm phát hoặc thu hẹp chuyển đổi. Bất cứ khi nào bạn downcast một dài để một int, hoặc một đôi đến một phao, khả năng mất dữ liệu tồn tại.Vì vậy, trình biên dịch sẽ buộc bạn phải chỉ ra rằng bạn thực sự muốn thực hiện việc chuyển đổi thu hẹp, bởi tín hiệu một lỗi biên dịch cho một cái gì đó như thế này:

float f = 12.3; 

Vì 12,3 đại diện cho một đôi, bạn phải rõ ràng đúc nó vào một phao (về cơ bản là ký tắt trên chuyển đổi thu hẹp). Nếu không, bạn có thể chỉ ra rằng số thực sự là một phao, bằng cách sử dụng hậu tố chính xác;

float f = 12.3f; 

Vì vậy, quá tóm tắt, phải chỉ định một hậu tố cho chờ đợinổi là một thỏa hiệp các nhà thiết kế ngôn ngữ đã chọn, để cân bằng nhu cầu để xác định chính xác một số là gì, với sự linh hoạt của chuyển đổi các số từ một loại lưu trữ sang loại lưu trữ khác.

+1

Cần lưu ý rằng nếu 'd' là đại diện' đôi' tốt nhất của một số số 'x',' float f = (float) d' sẽ là số gần nhất 'float' đối với một số giá trị nằm trong một phần nghìn tỷ của' x', mặc dù nó đòi hỏi một kiểu chữ. Ngược lại, nếu 'f' là đại diện' float' tốt nhất của một số giá trị số 'x',' double d = f' sẽ không yêu cầu một kiểu chữ mặc dù nó thường sẽ không ở đâu gần với 'double tốt nhất 'đại diện' x', và có thể bị tắt bởi * hàng trăm đơn vị độ lớn *. Tôi thấy nó mỉa mai rằng 'float f = (float) (1.0/10.0)' cần một diễn viên, nhưng 'double d = 1.0f/10.0f' thì không. – supercat

+0

"Vì vậy, trình biên dịch sẽ buộc bạn chỉ ra rằng bạn thực sự muốn thực hiện chuyển đổi thu hẹp, bằng cách báo hiệu lỗi biên dịch cho một cái gì đó như thế này:" Điều đó cũng áp dụng cho lâu mặc dù – RetroCode

+0

@Perception tại sao bạn viết Vì lý do rõ ràng trong điểm đầu tiên bạn có thể vui lòng xây dựng nó? – ANinJa

0

Float là điểm nổi IEEE 324 chính xác 32 bit và Double là điểm nổi động IEEE 644 64 bit. Khi bạn sử dụng một giá trị có dấu thập phân và nếu bạn không chỉ định là 0.23f (đặc biệt là float), java xác định nó là một double.

Đối với giá trị thập phân, kiểu dữ liệu kép thường là lựa chọn mặc định được thực hiện bởi java. Check This

1

Trong quá trình biên dịch, tất cả các số dấu chấm động (số thập phân) mặc định tăng gấp đôi.

Do đó, nếu bạn không muốn số điện thoại tăng gấp đôi và chỉ muốn nó như float, bạn phải nói rõ ràng trình biên dịch bằng cách thêm một f hoặc F ở cuối của hằng số chữ.

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