2013-07-14 37 views
12

Tôi có thể dễ dàng đọc số 2e15 dưới dạng "hai nghìn tỷ" trong nháy mắt, nhưng đối với 2000000000000000 tôi phải đếm số 0, mất nhiều thời gian hơn và có thể dẫn đến lỗi.Java: Tại sao tôi không thể khai báo các kiểu số nguyên sử dụng ký pháp khoa học?

Tại sao tôi không thể khai báo int hoặc long bằng cách sử dụng chữ như 2e9 hoặc 1.3e6? Tôi hiểu rằng sức mạnh âm 10, chẳng hạn như 2e-3 hoặc sức mạnh 10 ít hơn số chữ số thập phân, chẳng hạn như 1.0003e3, sẽ tạo ra số dấu chấm động, nhưng tại sao Java không cho phép khai báo như vậy, và chỉ cần cắt ngắn phần dấu phẩy động và đưa ra cảnh báo nhẹ trong trường hợp giá trị kết quả là không tách rời?

Có lý do kỹ thuật nào khiến đây là ý tưởng tồi hay tất cả là về an toàn kiểu? Nó sẽ không thể tầm thường cho trình biên dịch chỉ đơn giản là phân tích một tuyên bố như

long x = 2e12 như long x = 2000000000000 //OK for long

int y = 2.1234e3 như int y = 2123.4 //warning: loss of precision

+7

[Eric Lippert] (http://blogs.msdn.com/b/ericlippert/archive/2012/04/ 03/10251901.aspx): "Tôi thường được hỏi tại sao trình biên dịch không thực hiện tính năng này hoặc tính năng đó, và tất nhiên câu trả lời luôn giống nhau: ** vì không ai thực hiện nó. ** Tính năng bắt đầu như chưa được thực hiện và chỉ được thực hiện khi mọi người dành nhiều nỗ lực thực hiện chúng: không cần nỗ lực, không có tính năng. Đây là câu trả lời không hài lòng tất nhiên, beca sử dụng thường là người hỏi câu hỏi đã đưa ra giả định rằng tính năng này rõ ràng là tốt đến mức chúng ta cần phải có lý do để ** không ** thực hiện nó. " –

+0

@BrianRoach: Tôi biết số nguyên là gì.Tôi đã hỏi nếu có một lý do cụ thể là tại sao các số được biểu diễn dưới dạng dấu phẩy động nhưng đánh giá thành một giá trị ** không thể tách rời cũ: không thể chỉ định '2.3e3 == 2300' mà không có diễn viên rõ ràng. Có lẽ lý do đơn giản là những gì John Kugelman trích dẫn. Điều đó sẽ có ý nghĩa. Lý do tôi hỏi chỉ là tôi đã tò mò nếu có một lý do kỹ thuật tại sao một tính năng như vậy sẽ là một ý tưởng tồi. – odougs

+0

Không, tôi nhận được phần đầu tiên ... nhưng đó không phải là ví dụ thứ hai của bạn; 'int y = 2123.4' –

Trả lời

16

Đó là bởi vì khi bạn sử dụng các ký hiệu khoa học bạn tạo a floating point number (một đôi trong của bạn thí dụ). Và bạn không thể gán một dấu phẩy động cho một số nguyên (đó sẽ là một chuyển đổi nguyên thủy thu hẹp, which is not a valid assignment conversion).

Vì vậy, điều này sẽ không làm việc, hoặc ví dụ:

int y = 2d; //can't convert double to int 

Bạn có một vài lựa chọn:

  • đúc một cách rõ ràng dấu chấm động đến một số nguyên: int y = (int) 2e6;
  • với Java 7+ sử dụng một nghìn dấu tách: int y = 2_000_000;
+0

Các tùy chọn bạn đề cập là dễ sử dụng và loại bỏ bất kỳ nhu cầu nào về tính năng giả thuyết mà tôi đã nói đến. Cảm ơn! – odougs

+4

Ngoài ra tuyệt vời để chỉ ra nghìn dấu phân cách. – Kong

+0

@assylias Có nhưng một số không có điểm kết thúc và không có hậu tố 'd' hoặc' f' được giả định là 'int'. Vì vậy, tôi nghĩ rằng OP đã hỏi tại sao, ví dụ, sẽ không '2e8' được hiểu là một' int', và tại sao sẽ không '2e12l' được hiểu là một' long' (mà sẽ phù hợp với cách không số ký hiệu khoa học được diễn giải). Câu trả lời dường như là "Không có lý do kỹ thuật nào tại sao các nhà thiết kế trình biên dịch Java xử lý ký hiệu sci trong vấn đề này. Họ có thể làm mọi thứ theo cách mà OP gợi ý, nhưng họ không làm vậy - có lẽ họ không nghĩ đến việc làm theo cách đó. " – yroc

1

Y Bạn đang hỏi về các quy tắc viết một số nguyên literals. Xem tài liệu tham khảo này: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html Khả năng sử dụng ký pháp khoa học dưới dạng chữ số nguyên có thể làm cho mọi thứ dễ dàng hơn nhưng chưa được triển khai. Tôi không thấy bất kỳ lý do kỹ thuật nào có thể ngăn không cho một tính năng như vậy được triển khai.

1

Vì đó là thiếu sót của Java.

(Cụ thể, rõ ràng là một tập hợp các chữ được trình bày bằng ký hiệu khoa học được biểu diễn chính xác bởi ints và longs, và nó là hợp lý để mong muốn một cách để thể hiện những chữ đó như ints và longs. 't một cách để làm điều đó bởi vì tất cả các ký hiệu khoa học ký hiệu nhất thiết phải nổi vì định nghĩa ngôn ngữ của Java.)

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