Возможная потеря доли - PullRequest
113 голосов
/ 30 июня 2009

Простите, если это наивный вопрос, однако сегодня я в растерянности.

У меня есть простое вычисление деления, такое как:

double returnValue = (myObject.Value / 10);

Значение - это int в объекте.

Я получаю сообщение о возможной потере доли. Однако, когда я заменяю double на int, сообщение исчезает.

Есть мысли о том, почему это произойдет?

Ответы [ 5 ]

159 голосов
/ 30 июня 2009

Когда вы делите два целых числа на значение с плавающей запятой, дробная часть теряется. Если вы бросите один из предметов на поплавок, вы не получите эту ошибку.

Так, например, превратить 10 в 10,0

double returnValue = (myObject.Value / 10.0);
56 голосов
/ 30 июня 2009

Вы делаете целочисленное деление, если myObject.Value является целым числом, поскольку обе стороны / имеют целочисленный тип.

Чтобы выполнить деление с плавающей запятой, одно из чисел в выражении должно иметь тип с плавающей запятой. Это было бы верно, если бы myObject.Value был double или любым из следующих:

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 голосов
/ 30 июня 2009

Предполагая, что myObject.Value является int, уравнение myObject.Value / 10 будет целочисленным делением, которое затем будет приведено к двойному.

Это означает, что myObject.Value, равное 12, приведет к тому, что returnValue станет 1, не 1.2.

Сначала вам нужно привести значение (я):

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

Это приведет к правильному значению 1.2, по крайней мере, к тому же правильному значению, которое допустимо для парных символов, учитывая их ограничения, но это обсуждается в других местах SO, почти бесконечно:

6 голосов
/ 30 июня 2009

Целое число, деленное на целое число, вернет вам целое число. Приведите либо значение к удвоению, либо поделите на 10,0.

4 голосов
/ 30 июня 2009

Я думаю, что поскольку myObject является int, вам следует

double returnValue=(myObject.Value/10.0); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...