Respuestas:
Uso Math.round()
, posiblemente en conjunción conMidpointRounding.AwayFromZero
p.ej:
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);
Asas de redondeo así:
redondeado al entero con signo de 32 bits más cercano. Si el valor está a medio camino entre dos números enteros, se devuelve el número par; es decir, 4.5 se convierte en 4 y 5.5 se convierte en 6.
Math.Round
ya que devuelve un int según sea necesario.
[0,.5)
- hacia abajo y exactamente la mitad de los números [.5,1)
- hacia arriba. Redondeando para sesgar incluso un poco los números pares, ya que se redondea (.5,1.5)
a 1 pero [1.5,2.5]
a 2.
También puedes usar la función:
//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}
Dependiendo de la arquitectura, es varias veces más rápido.
double d;
int rounded = (int)Math.Round(d);
Sé que esta pregunta es antigua, pero la encontré en mi búsqueda de la respuesta a mi pregunta similar. Pensé en compartir el consejo muy útil que me dieron.
Cuando convierta a int, simplemente agregue .5
valor a su valor antes de hacer downcasting. Como el downcasting int
siempre cae al número más bajo (p (int)1.7 == 1
. Ej. ), Si su número es .5
o más alto, sumar .5
lo traerá al siguiente número y su downcast int
debería devolver el valor correcto. (por ejemplo (int)(1.8 + .5) == 2
)
+ 0.5 * Math.Abs(d)
Los métodos en otras respuestas arrojan OverflowException
si el valor flotante está fuera del rango 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;
}
Para Unity, use 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); }
Estoy desarrollando una calculadora científica que tiene un botón Int. He descubierto que la siguiente es una solución simple y confiable:
double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);
Math.Round a veces produce resultados inesperados o indeseables, y la conversión explícita a un número entero (mediante conversión o Convert.ToInt ...) a menudo produce valores incorrectos para números de mayor precisión. El método anterior parece funcionar siempre.
Convert.ToInt32()
hará lo mismo, o simplemente eliminará todo después del decimal?