Как вы конвертируете двойное в ближайший int?
147
Используйте 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
Convert.ToInt32()
делать то же самое, или это просто лишить все после десятичной дроби?Ссылка
Ручки закругления примерно так:
источник
Math.Round
как он возвращает int как требуется.[0,.5)
- вниз и ровно половину чисел -[.5,1)
- вверх. Округление до четного смещения четных чисел, округление до(.5,1.5)
1, а[1.5,2.5]
до 2.Вы также можете использовать функцию:
В зависимости от архитектуры это в несколько раз быстрее.
источник
источник
Я знаю, что этот вопрос старый, но я наткнулся на него в поисках ответа на мой похожий вопрос. Я думал, что поделюсь очень полезным советом, который мне дали.
При конвертации в int просто добавьте
.5
свою ценность перед понижением. Так как значение downcastingint
всегда опускается до меньшего числа (например(int)1.7 == 1
), если ваш номер больше.5
или больше, добавление.5
переведет его в следующий номер, и ваш downcastint
должен вернуть правильное значение. (например(int)(1.8 + .5) == 2
)источник
+ 0.5 * Math.Abs(d)
Методы в других ответах выдают,
OverflowException
если значение с плавающей точкой находится вне диапазона Int. https://docs.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_источник
Для Unity используйте Mathf.RoundToInt .
Источник
источник
Я разрабатываю научный калькулятор, который оснащен кнопкой Int. Я нашел следующее простое, надежное решение:
Иногда Math.Round выдает неожиданные или нежелательные результаты, а явное преобразование в целое число (через приведение или Convert.ToInt ...) часто приводит к неправильным значениям для чисел с более высокой точностью. Вышеуказанный метод, кажется, всегда работает.
источник