2012-09-07 31 views
11

tôi có giá trị như thế này:kết quả bất ngờ trong dài/int phận

long millis = 11400000; 
int consta = 86400000; 
double res = millis/consta; 

Câu hỏi đặt ra là: tại sao res bằng 0.0 (thay vì ca. 0.131944)? Nó được lưu trữ trong double vì vậy không nên làm tròn phải không?

+1

Bộ phận số nguyên ... – Mysticial

Trả lời

18

Khi bạn đang sử dụng một nhà điều hành nhị phân, cả hai lập luận nên có một loại tương tự và kết quả sẽ là trong loại của họ quá. Khi bạn muốn chia (int)/(long) nó biến thành (long)/(long) và kết quả là (long). bạn nên làm điều đó (double)/(long) hoặc (int)/(double) để có kết quả kép.Kể từ khi đôi lớn mà int và dài, int và dài sẽ được biến thành đôi trong (double)/(long)(int)/(double)

17

Vì bạn đang chia một số long theo số int bạn nhận được kết quả long. gì bạn đang làm một cách hiệu quả là

double res = (double) (millis/consta); 

như millis/consta0, khi đúc để double0.0

Thử cách sau để chia đôi bởi một int và có được một kết quả kép.

double res = (double) millis/consta; 

mà là giống như

double res = ((double) millis)/((double) consta)); 
1

millis/consta là một phép chia số nguyên, mà kết quả trong 0. Đúc trong dòng:

double res = millis/consta; 

được thực hiện trên kết quả:

double res = (double)(millis/consta); 

Những gì bạn cần làm là để cast một trong những toán hạng:

double res = (double)millis/consta; 
3

Bạn đang làm long phân chia (int được đúc thành dài), do đó bạn nhận được long giá trị, là số nguyên (như vậy, 0)

Bạn nên làm

double res = (double) millis/consta; 

Khi một trong những giá trị được đúc sẽ tăng gấp đôi, người kia là quá đúc nên các hoạt động sử dụng cùng loại ở cả hai nhà khai thác.

+0

Đây là câu trả lời đúng và phù hợp nhất. – Shark

0

Khi điều này xảy ra, nó sẽ tự động chuyển sang int để thực hiện thao tác. Thy viết nó như:

long millis = 11400000; 
int consta = 86400000; 
double res = ((double)millis)/((double)consta); 

Và nó sẽ hoạt động.

1

Loại kết quả của độ lệch dài và int sẽ dài, không thể giữ số thập phân.

bạn muốn bỏ nó vào một đôi trước khi bạn gán nó

0

Điều này là do dài: Các kiểu dữ liệu dài là một 64-bit đã ký hai của số nguyên bổ sung. int: Kiểu dữ liệu int là số nguyên bổ sung của hai ký tự 32 bit.

See Primitive type Có nghĩa là cả hai đều là số nguyên. Vì chúng ta chia dài theo số nguyên, kết quả là dài 0. Nhưng bạn gán giá trị này cho giá trị res (double) và in nó. Vì vậy, kết quả 0.0 được hiển thị.

long millis = 11400000; 
int consta = 86400000; 

System.out.println("millis/consta = " + millis/consta); // print 0 

double res = millis/consta; 
System.out.println("Res " + res); // print 0.0 
Các vấn đề liên quan