Ответы:
Используйте 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
double d = 1.234;
int i = Convert.ToInt32(d);
Ручки закругления примерно так:
округляется до ближайшего 32-разрядного целого числа со знаком. Если значение находится посередине между двумя целыми числами, возвращается четное число; то есть 4,5 преобразуется в 4, а 5,5 преобразуется в 6.
Math.Round
как он возвращает int как требуется.
[0,.5)
- вниз и ровно половину чисел - [.5,1)
- вверх. Округление до четного смещения четных чисел, округление до (.5,1.5)
1, а [1.5,2.5]
до 2.
Вы также можете использовать функцию:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
В зависимости от архитектуры это в несколько раз быстрее.
double d;
int rounded = (int)Math.Round(d);
Я знаю, что этот вопрос старый, но я наткнулся на него в поисках ответа на мой похожий вопрос. Я думал, что поделюсь очень полезным советом, который мне дали.
При конвертации в int просто добавьте .5
свою ценность перед понижением. Так как значение downcasting int
всегда опускается до меньшего числа (например (int)1.7 == 1
), если ваш номер больше .5
или больше, добавление .5
переведет его в следующий номер, и ваш downcast int
должен вернуть правильное значение. (например (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_
int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}
Для 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); }
Я разрабатываю научный калькулятор, который оснащен кнопкой Int. Я нашел следующее простое, надежное решение:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Иногда Math.Round выдает неожиданные или нежелательные результаты, а явное преобразование в целое число (через приведение или Convert.ToInt ...) часто приводит к неправильным значениям для чисел с более высокой точностью. Вышеуказанный метод, кажется, всегда работает.
Convert.ToInt32()
делать то же самое, или это просто лишить все после десятичной дроби?