Helpex - Trao đổi & giúp đỡ Đăng nhập

Truyền đôi cho số nguyên trong Java?

Ngô Minh Thy
· 19:53 01/02/2012
2 ngày trước

Bất kỳ cách nào để cast java.lang.Doubleđể java.lang.Integer?

Nó ném một ngoại lệ

"java.lang.ClassCastException: java.lang.Double không tương thích với java.lang.Integer"

314 hữu ích 0 bình luận 930k xem chia sẻ
Lý Kim Liên
· 19:54 01/02/2012
19:54:13 01/02/2012

A Doublekhông phải là một Integer, vì vậy các diễn viên sẽ không làm việc. Lưu ý sự khác biệt giữa Double lớpdouble nguyên thủy . Cũng lưu ý rằng a Doublelà a Number, vì vậy nó có phương thức intValue , mà bạn có thể sử dụng để lấy giá trị làm nguyên thủy int.

427 hữu ích 5 bình luận chia sẻ
Dương Hồng Ðào
· 19:56 01/02/2012
19:56:28 01/02/2012

Bạn cần lấy giá trị int một cách rõ ràng bằng phương thức intValue () như thế này:

Double d = 5.25;
Integer i = d.intValue(); // i becomes 5

Hoặc là

double d = 5.25;
int i = (int) d;
523 hữu ích 4 bình luận chia sẻ
Hoàng Xuân Liễu
· 14:15 27/10/2014
14:15:33 27/10/2014

Tôi nghĩ rằng không thể hiểu các câu trả lời khác mà không bao gồm những cạm bẫy và lý do đằng sau nó.

Bạn không thể trực tiếp truyền Integermột Doubleđối tượng. Ngoài ra DoubleIntegerlà các đối tượng bất biến, vì vậy bạn không thể sửa đổi chúng theo bất kỳ cách nào.

Mỗi lớp số có một thay thế nguyên thủy ( Doublevs double, Integervs int, ...). Lưu ý rằng những nguyên thủy này bắt đầu bằng một ký tự chữ thường (ví dụ int). Điều đó cho chúng ta biết rằng họ không phải là lớp / đối tượng. Điều đó cũng có nghĩa là họ không có phương pháp. Ngược lại, các lớp (ví dụ Integer) hoạt động như các hộp / hàm bao quanh các nguyên thủy này, điều này cho phép sử dụng chúng như các đối tượng.

Chiến lược:

Để chuyển đổi Doublethành một, Integerbạn cần phải tuân theo chiến lược này:

  1. Chuyển đổi Doubleđối tượng để nguyên thủy double. (= "bỏ hộp")
  2. Chuyển đổi nguyên thủy doublethành nguyên thủy int. (= "đúc")
  3. Chuyển đổi nguyên thủy inttrở lại một Integerđối tượng. (= "quyền anh")

Trong mã:

// starting point
Double myDouble = Double.valueOf(10.0);

// step 1: unboxing
double dbl = myDouble.doubleValue();

// step 2: casting
int intgr = (int) dbl;

// step 3: boxing
Integer val = Integer.valueOf(intgr);

Trên thực tế có một phím tắt. Bạn có thể bỏ hộp ngay lập tức từ Doublethẳng đến nguyên thủy int. Bằng cách đó, bạn có thể bỏ qua bước 2 hoàn toàn.

Double myDouble = Double.valueOf(10.0);
Integer val = Integer.valueOf(myDouble.intValue()); // the simple way

Cạm bẫy:

Tuy nhiên, có rất nhiều điều không được nêu trong đoạn mã trên. Các mã ở trên là không an toàn.

Double myDouble = null;
Integer val = Integer.valueOf(myDouble.intValue()); // will throw a NullPointerException

// a null-safe solution:
Integer val = (myDouble == null)? null : Integer.valueOf(myDouble.intValue());

Bây giờ nó hoạt động tốt cho hầu hết các giá trị. Tuy nhiên, số nguyên có phạm vi rất nhỏ (giá trị tối thiểu / tối đa) so với a Double. Trên hết, nhân đôi cũng có thể giữ "giá trị đặc biệt", số nguyên không thể:

  • 1/0 = + vô cùng
  • -1/0 =
  • 0/0 = không xác định (NaN)

Vì vậy, tùy thuộc vào ứng dụng, bạn có thể muốn thêm một số bộ lọc để tránh Ngoại lệ khó chịu.

Sau đó, thiếu sót tiếp theo là chiến lược làm tròn. Theo mặc định, Java sẽ luôn làm tròn xuống. Làm tròn xuống có ý nghĩa hoàn hảo trong tất cả các ngôn ngữ lập trình. Về cơ bản Java chỉ là vứt bỏ một số byte. Trong các ứng dụng tài chính, bạn chắc chắn sẽ muốn sử dụng tính năng làm tròn một nửa (ví dụ: round(0.5) = 1round(0.4) = 0).

// null-safe and with better rounding
long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = Integer.valueOf(rounded);

Tự động- (un) quyền anh

Bạn có thể bị cám dỗ sử dụng quyền anh tự động (un) trong việc này, nhưng tôi thì không. Nếu bạn đã bị mắc kẹt bây giờ, thì các ví dụ tiếp theo cũng sẽ không rõ ràng. Nếu bạn không hiểu hoạt động bên trong của quyền anh tự động (un) thì xin đừng sử dụng nó.

Integer val1 = 10; // works
Integer val2 = 10.0; // doesn't work

Double val3 = 10; // doesn't work
Double val4 = 10.0; // works

Double val5 = null; 
double val6 = val5; // doesn't work (throws a NullPointerException)

Tôi đoán những điều sau đây không nên là một bất ngờ. Nhưng nếu có, thì bạn có thể muốn đọc một số bài viết về việc truyền trong Java.

double val7 = (double) 10; // works
Double val8 = (Double) Integer.valueOf(10); // doesn't work
Integer val9 = (Integer) 9; // pure nonsense

Thích giá trịOf:

Ngoài ra, không nên sử dụng hàm new Integer()tạo (như một số câu trả lời khác đề xuất). Các valueOf()phương pháp tốt hơn bởi vì họ sử dụng bộ nhớ đệm. Đó là một thói quen tốt để sử dụng các phương pháp này, bởi vì đôi khi chúng sẽ giúp bạn tiết kiệm một số bộ nhớ.

long rounded = (myDouble == null)? 0L: Math.round(myDouble.doubleValue());
Integer val = new Integer(rounded); // waste of memory
41 hữu ích 1 bình luận chia sẻ
Huỳnh Bá Thịnh
· 09:53 15/11/2013
09:53:14 15/11/2013

Tôi thấy ba khả năng. Hai chữ số đầu tiên cắt bỏ các chữ số, một vòng cuối cùng đến Số nguyên gần nhất.

double d = 9.5;
int i = (int)d;
//i = 9

Double D = 9.5;
int i = Integer.valueOf(D.intValue());
//i = 9

double d = 9.5;
Long L = Math.round(d);
int i = Integer.valueOf(L.intValue());
//i = 10
37 hữu ích 1 bình luận chia sẻ
Dương Hoài Tín
· 20:00 01/02/2012
20:00:24 01/02/2012

Như thế này:

Double foo = 123.456;
Integer bar = foo.intValue();
21 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java casting , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm