Как я могу преобразовать double в ближайшее целое значение?

Как вы конвертируете double в ближайший int?

Ответ 1

Используйте Math.round(), возможно, в сочетании с MidpointRounding.AwayFromZero

например:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

Ответ 2

double d = 1.234;
int i = Convert.ToInt32(d);

Ссылка

Ручки округляются так:

округляется до ближайшего 32-разрядного целого числа со знаком. Если значение равно половине между двумя целыми числами, четное число возвращается; то есть 4,5 преобразуется в 4, а 5.5 преобразуется в 6.

Ответ 3

Вы также можете использовать функцию:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

В зависимости от архитектуры это в несколько раз быстрее.

Ответ 4

double d;
int rounded = (int)Math.Round(d);

Ответ 5

Я знаю, что этот вопрос старый, но я наткнулся на него в поисках ответа на мой похожий вопрос. Я думал, что поделюсь очень полезным советом, который мне дал.

При преобразовании в int просто добавьте значение .5 к своему значению перед подавлением. Поскольку downcasting to int всегда падает до более низкого числа (например, (int) 1.7 = 1), если ваш номер равен .5 или выше, добавление .5 приведет его к следующему номеру, а ваш downcast to int должен вернуть правильное значение, (например, (int) (1,8 + 0,5) = 2)

Я надеюсь, что этот ответ будет полезен для всех.

Ответ 6

Я разрабатываю научный калькулятор, который управляет кнопкой Int. Я нашел следующее простое, надежное решение:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

Math.Round иногда вызывает неожиданные или нежелательные результаты, а явное преобразование в integer (через cast или Convert.ToInt...) часто приводит к неправильным значениям для чисел с более высокой точностью. Этот метод всегда работает.