Возможная потеря фракции

119

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

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

double returnValue = (myObject.Value / 10);

Значение - это целое число в объекте.

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

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

CodeLikeBeaker
источник
Спасибо всем за отличные отзывы. Теперь имеет смысл терять десятичную точку при делении двух значений типа int.
CodeLikeBeaker,

Ответы:

168

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

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

double returnValue = (myObject.Value / 10.0);
Олафур Вааге
источник
57

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

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

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

Целое число, разделенное на целое число, вернет вам целое число. Преобразуйте значение Value в двойное или разделите на 10.0.

камбий
источник
7

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

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

Сначала вам нужно указать значение (я):

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

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

paxdiablo
источник
4

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

double returnValue=(myObject.Value/10.0); 
выдаёт ошибку сегментации
источник