Відповіді:
Використовувати 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
до вашої вартості перед тим, як скинути. У зв'язку з тим, що вихідний канал int
завжди опускається до нижчого числа (наприклад (int)1.7 == 1
), якщо ваше число більше .5
або вище, додавання .5
призведе до наступного числа, а ваш знижений режим int
повинен повернути правильне значення. (наприклад (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Методи в інших відповідях кидають, OverflowException
якщо значення float знаходиться поза діапазоном 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()
зробити те ж саме, чи він просто зніме все після десяткової?