Có thể mất phân số


119

Xin thứ lỗi cho tôi nếu đây là một câu hỏi ngây thơ, tuy nhiên hôm nay tôi đã rất lúng túng.

Tôi có một phép tính chia đơn giản như sau:

double returnValue = (myObject.Value / 10);

Giá trị là một int trong đối tượng.

Tôi nhận được một thông báo cho biết Có thể Mất Phân số. Tuy nhiên, khi tôi thay đổi double thành int, thông báo sẽ biến mất.

Bất kỳ suy nghĩ về lý do tại sao điều này sẽ xảy ra?


Cảm ơn tất cả các bạn vì những phản hồi tuyệt vời. Bây giờ có nghĩa là bạn mất dấu thập phân khi chia 2 giá trị int.
CodeLikeBeaker

Câu trả lời:


168

Khi bạn chia hai số int thành một giá trị dấu phẩy động, phần phân số sẽ bị mất. Nếu bạn chuyển một trong các mục vào phao, bạn sẽ không gặp lỗi này.

Vì vậy, ví dụ, biến 10 thành 10.0

double returnValue = (myObject.Value / 10.0);

57

Bạn đang thực hiện phép chia số nguyên nếu myObject.Valuelà một int, vì cả hai cạnh của /đều là kiểu số nguyên.

Để thực hiện phép chia dấu phẩy động, một trong các số trong biểu thức phải thuộc kiểu dấu phẩy động. Điều đó sẽ đúng nếu myObject.Value là một nhân đôi hoặc bất kỳ điều nào sau đây:

double returnValue = myObject.Value / 10.0;
double returnValue = myObject.Value / 10d; //"d" is the double suffix
double returnValue = (double)myObject.Value / 10;
double returnValue = myObject.Value / (double)10;

7

Một số nguyên chia cho một số nguyên sẽ trả về một số nguyên của bạn. Truyền Giá trị thành nhân đôi hoặc chia cho 10,0.


7

Giả sử đó myObject.Valuelà một int, phương trìnhmyObject.Value / 10 sẽ là một phép chia số nguyên sau đó sẽ được chuyển thành một nhân đôi.

Điều đó có nghĩa là myObject.Value là 12 sẽ dẫn đến returnValue trở thành 1, không phải 1,2.

Trước tiên, bạn cần truyền (các) giá trị:

double returnValue = (double)(myObject.Value) / 10.0;

Điều này sẽ dẫn đến giá trị chính xác 1.2, ít nhất là chính xác vì nhân đôi sẽ cho phép các giới hạn của chúng nhưng điều đó được thảo luận ở những nơi khác trên SO, gần như là vô tận :-).


4

Tôi nghĩ vì myObject là một int, bạn nên

double returnValue=(myObject.Value/10.0); 
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.