2011-06-24 43 views
92

Trong Java, tôi muốn chuyển đổi một đôi để một số nguyên, tôi biết nếu bạn làm điều này:chuyển đổi gấp đôi lên số nguyên trong java

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 rất có thể sẽ nhận được 2. Tuy nhiên, tôi tự hỏi: kể từ khi tuyên bố tăng gấp đôi số nguyên đôi khi trông giống như 1,9999999998 hoặc một cái gì đó, lại có một khả năng mà đúc một đôi tạo thông qua Math.round() sẽ vẫn dẫn đến số bị cắt bớt, thay vì số được làm tròn mà chúng tôi đang tìm kiếm (ví dụ: 1 thay vì 2 trong mã như được trình bày)?

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

Nếu vậy: Có cách nào tốt hơn để làm cho một đôi vào một int tròn mà không chạy nguy cơ cắt ngắn?


Đã tìm ra điều gì đó: Math.round (x) trả về một khoảng thời gian dài chứ không phải gấp đôi. Do đó: Math.round() không thể trả về một con số trông giống như 3.9999998. Vì vậy, int (Math.round()) sẽ không bao giờ cần phải cắt ngắn bất cứ điều gì và sẽ luôn luôn làm việc.

+4

Math.round (double) trả về một khoảng thời gian dài chứ không phải gấp đôi. – qbert220

Trả lời

79

là có một khả năng mà đúc một tạo thông qua Math.round() đôi vẫn sẽ dẫn đến một cắt ngắn xuống số

Không, round() sẽ luôn tròn đôi của bạn với giá trị chính xác, và sau đó, nó sẽ được truyền tới số long sẽ 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ó bất kỳ phần phân đoạn nào còn lại.

Sau đây là các tài liệu từ Math.round(double):

Trả gần nhất dài đến cuộc tranh cãi. Kết quả được làm tròn thành một số nguyên bằng cách thêm 1/2, lấy sàn của kết quả và đúc kết quả thành loại dài. Nói cách khác, kết quả là tương đương với giá trị của biểu thức:

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

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

+0

Có. Không thể tưởng tượng một/dài/để int cho vấn đề. Chắc chắn! Nên đã tìm ra điều này :( – vdMandele

+1

Trong khi đúng là 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 đơn giản do việc đúc từ đôi là số rất lớn '[max double: 1.7976931348623157E308 ] 'to int nhỏ hơn nhiều' [max int: 2147483647] '. Chỉ cần nhớ cái gì đó. –

-7
double a = 1.450; 

String sa = String.valueOf(a); 
int lengthUntilPoint = sa.indexOf(".")+1; 
int power = sa.length() - lengthUntilPoint; 
int ia = (int) (a* Math.pow(10, power)); 
+3

Trong khi mã này có thể thú vị để tìm hiểu một số điều cơ bản về thao tác chuỗi, nó thực sự không phù hợp ở đây. Không chỉ do thời gian và dung lượng bộ nhớ, nhưng nó không chính xác. http://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#toString-double- Nếu bạn nhìn, bạn sẽ thấy rằng đối với một số số '.' charecter không tách rời các đơn vị và phần mười, mà đúng hơn là chữ số quan trọng nhất thứ hai. – v010dya

12

Đố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(); 
+0

Ông đang tìm kiếm một giá trị làm tròn. – EJP

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

Giải quyết mục đích của tôi.

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