Почему Math.Floor (Double) возвращает значение типа Double? - PullRequest
94 голосов
/ 28 августа 2009

Мне нужно получить целочисленное значение слева от десятичного или двойного. Например: мне нужно получить значение 4 из 4.6. Я попытался использовать функцию Math.Floor, но она возвращает двойное значение, например: она возвращает 4.0 из 4.6. В документации MSDN сказано, что она возвращает целочисленное значение. Я что-то здесь упускаю? Или есть другой способ добиться того, что я ищу?

Ответы [ 6 ]

131 голосов
/ 28 августа 2009

Диапазон double намного шире, чем диапазон int или long. Рассмотрим этот код:

double d = 100000000000000000000d;
long x = Math.Floor(d); // Invalid in reality

Целое число находится вне диапазона long - так что вы ожидаете, что произойдет?

Как правило, вы знаете, что значение будет на самом деле находиться в диапазоне int или long, поэтому вы разыгрываете его:

double d = 1000.1234d;
int x = (int) Math.Floor(d);

но ответственность за это приведение лежит на самом разработчике, а не на Math.Floor. Было бы неоправданно ограничивать его просто сбоем, за исключением всех значений вне диапазона long.

11 голосов
/ 28 августа 2009

Согласно MSDN, Math.Floor (double) возвращает значение типа double: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx

Если вы хотите это как int:

int result = (int)Math.Floor(yourVariable);

Я вижу, как статья MSDN может вводить в заблуждение, они должны были указать, что хотя результатом является "целое число" (в данном случае означает целое число), оно по-прежнему имеет тип TYPE Double

4 голосов
/ 28 августа 2009

Если вам просто нужна целая часть числа, приведите число к int. Это усечет число в десятичной точке.

double myDouble = 4.6;
int myInteger = (int)myDouble;
0 голосов
/ 16 января 2018
Convert.ToInt32(Math.Floor(Convert.ToDouble(value)))

Это даст вам точное значение, как вы хотите, если вы берете 4.6, он возвращает 4 в качестве вывода.

0 голосов
/ 28 августа 2009

Этаж оставляет его двойным, чтобы вы могли делать больше двойных вычислений с ним. Если вы хотите, чтобы оно было int, приведите результат floor как int. Не применяйте оригинальный double как int, поскольку правила для пола различны (IIRC) для отрицательных чисел.

0 голосов
/ 28 августа 2009

Это правильно. Глядя на объявление, Math.Floor (double) возвращает double (см. http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx).. Я предполагаю, что под «целым числом» они подразумевают «целое число».

...