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


119

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

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

double returnValue = (myObject.Value / 10);

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

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

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


Спасибо всем за отличные отзывы. Теперь имеет смысл терять десятичную точку при делении двух значений типа 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, почти бесконечно :-).


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.