chuyển đôi thành số nguyên trong java


114

Trong Java, tôi muốn chuyển đổi một số kép thành một số nguyên, tôi biết nếu bạn làm điều này:

double x = 1.5;
int y = (int)x;

bạn nhận được y = 1. Nếu bạn làm điều này:

int y = (int)Math.round(x);

Bạn có thể sẽ nhận được 2. Tuy nhiên, tôi đang tự hỏi: vì các biểu diễn kép của số nguyên đôi khi trông giống như 1.9999999998 hoặc một cái gì đó, nên có khả năng truyền một kép được tạo qua Math.round () vẫn sẽ dẫn đến một số bị cắt bớt, thay vì so với số được làm tròn mà chúng ta đang tìm kiếm (tức là: 1 thay vì 2 trong mã như được đại diện)?

(và vâng, ý tôi là: Có bất kỳ giá trị nào cho x không, trong đó y sẽ hiển thị kết quả là một biểu diễn cắt ngắn chứ không phải là một biểu diễn làm tròn của x?)

Nếu vậy: Có cách nào tốt hơn để tạo một nhân đôi thành một số nguyên được làm tròn mà không có nguy cơ bị cắt bớt?


Đã tìm ra điều gì đó: Math.round (x) trả về một giá trị dài, không phải là một đôi. Do đó: Math.round () không thể trả về một số giống như 3,9999998. Do đó, int (Math.round ()) sẽ không bao giờ cần phải cắt bớt bất cứ thứ gì và sẽ luôn hoạt động.


6
Math.round (double) trả về một giá trị dài, không phải một đôi.
qbert220

Câu trả lời:


95

có khả năng truyền một cú đúp được tạo qua Math.round()vẫn dẫn đến một số bị cắt bớt

Không, round()sẽ luôn làm tròn số kép của bạn thành giá trị chính xác và sau đó, nó sẽ được chuyển thành giá trị longsẽ cắt bớt bất kỳ vị trí thập phân nào. Nhưng sau khi làm tròn, sẽ không còn phần phân số nào nữa.

Đây là tài liệu từ Math.round(double):

Trả về độ dài gần nhất cho đối số. Kết quả được làm tròn thành số nguyên bằng cách thêm 1/2, lấy giá trị tầng của kết quả và ép kết quả thành kiểu long. Nói cách khác, kết quả bằng giá trị của biểu thức:

(long)Math.floor(a + 0.5d)

3
Điểm quan trọng là việc làm tròn được thực hiện theo phương pháp làm tròn. Một giá trị dài được trả về, có thể được truyền một cách an toàn thành một giá trị int (giả sử giá trị trả về sẽ luôn nằm trong phạm vi int).
qbert220

Đúng. Không thể tưởng tượng a / long / to int đưa ra các vấn đề. Chắc chắn! Nên đã tìm :( này
vdMandele

1
Mặc dù đúng là việc cắt ngắn sẽ không xảy ra do làm tròn, bạn vẫn có thể không nhận được kết quả mong đợi chỉ đơn giản là do ép kiểu từ double là một số rất lớn [max double: 1.7976931348623157E308]thành int nhỏ hơn nhiều [max int: 2147483647]. Chỉ là một thứ để ghi nhớ trong đầu.
Nelda.techspiress

22

Đối với các kiểu dữ liệu Doubleđể int, bạn có thể sử dụng như sau:

Double double = 5.00;

int integer = double.intValue();

Anh ta đang tìm kiếm một giá trị làm tròn.
Marquis of Lorne,

1
Tôi không nghĩ rằng điều đó sẽ mang lại những gì bạn mong đợi với 4,99999999999 (sẽ cho 4 chứ không phải 5)
murkle

10
Double perValue = 96.57;
int roundVal= (int) Math.round(perValue);

Đã giải quyết mục đích của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.