Как я могу преобразовать двойное в ближайшее целое значение? - PullRequest
128 голосов
/ 11 марта 2009

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

Ответы [ 7 ]

237 голосов
/ 11 марта 2009
double d = 1.234;
int i = Convert.ToInt32(d);

Ссылка

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

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

74 голосов
/ 11 марта 2009

Используйте 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
35 голосов
/ 10 ноября 2011

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

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

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

11 голосов
/ 11 марта 2009
double d;
int rounded = (int)Math.Round(d);
4 голосов
/ 09 апреля 2014

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

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

Надеюсь, этот ответ кому-нибудь пригодится.

0 голосов
/ 12 октября 2018

Для Unity используйте Mathf.RoundToInt .

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

Источник

public static int RoundToInt(float f) { return (int)Math.Round(f); }
0 голосов
/ 12 апреля 2011

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

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

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

...