¿Cómo se convierte un doble en el int más cercano?
147
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
Convert.ToInt32()hará lo mismo, o simplemente eliminará todo después del decimal?Referencia
Asas de redondeo así:
fuente
Math.Roundya 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:
Dependiendo de la arquitectura, es varias veces más rápido.
fuente
fuente
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
.5valor a su valor antes de hacer downcasting. Como el downcastingintsiempre cae al número más bajo (p(int)1.7 == 1. Ej. ), Si su número es.5o más alto, sumar.5lo traerá al siguiente número y su downcastintdebería devolver el valor correcto. (por ejemplo(int)(1.8 + .5) == 2)fuente
+ 0.5 * Math.Abs(d)Los métodos en otras respuestas arrojan
OverflowExceptionsi 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_fuente
Para Unity, use Mathf.RoundToInt .
Fuente
fuente
Estoy desarrollando una calculadora científica que tiene un botón Int. He descubierto que la siguiente es una solución simple y confiable:
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.
fuente