Odpowiedzi:
Użyj Math.round()
, ewentualnie w połączeniu zMidpointRounding.AwayFromZero
na przykład:
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);
Uchwyty zaokrągleń w ten sposób:
zaokrąglone do najbliższej 32-bitowej liczby całkowitej ze znakiem. Jeśli wartość jest w połowie między dwiema liczbami całkowitymi, zwracana jest liczba parzysta; to znaczy 4,5 jest konwertowane na 4, a 5,5 jest konwertowane na 6.
Math.Round
ponieważ zwraca int zgodnie z wymaganiami.
[0,.5)
- w dół i dokładnie połowę liczb - [.5,1)
- w górę. Zaokrąglanie do nawet nieznacznie odchyla liczby parzyste, ponieważ zaokrągla (.5,1.5)
do 1, ale [1.5,2.5]
do 2.
Możesz również użyć funkcji:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
W zależności od architektury jest kilkukrotnie szybszy.
double d;
int rounded = (int)Math.Round(d);
Wiem, że to pytanie jest stare, ale natrafiłem na nie, szukając odpowiedzi na podobne pytanie. Pomyślałem, że podzielę się bardzo przydatną wskazówką, którą otrzymałem.
Podczas konwersji na int, po prostu dodaj .5
do swojej wartości przed obniżeniem. Ponieważ int
obniżenie do zawsze spada do niższej liczby (np. (int)1.7 == 1
), Jeśli twój numer jest .5
lub wyższy, dodanie .5
podniesie go do następnej liczby, a obniżenie do int
powinno zwrócić poprawną wartość. (np. (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Metody w innych odpowiedziach generują, OverflowException
jeśli wartość zmiennoprzecinkowa jest poza zakresem 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;
}
W przypadku aparatu Unity użyj 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); }
Opracowuję kalkulator naukowy z przyciskiem Int. Oto proste, niezawodne rozwiązanie:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Round czasami daje nieoczekiwane lub niepożądane wyniki, a jawna konwersja na liczbę całkowitą (przez rzutowanie lub Convert.ToInt ...) często daje błędne wartości dla liczb o większej precyzji. Powyższa metoda wydaje się zawsze działać.
Convert.ToInt32()
zrobi tego samego, czy po prostu usunie wszystko po przecinku?