¿Cómo podría convertir un doble al valor entero más cercano?

147

¿Cómo se convierte un doble en el int más cercano?

leora
fuente

Respuestas:

78

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
nickf
fuente
66
¿No Convert.ToInt32()hará lo mismo, o simplemente eliminará todo después del decimal?
The Muffin Man
208
En realidad no produce un número entero, sino un doble.
gatopeich 01 de
13
@Ronnie - no, eso es por diseño. De forma predeterminada, Math.Round redondeará los números de punto medio (x + .5) al número par más cercano . Si desea un comportamiento diferente, debe especificarlo a través de una bandera. msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf
66
¡Bueno, yo nunca! :)
Ronnie
55
El doble no es int.
Evgeni Nabokov el
267
double d = 1.234;
int i = Convert.ToInt32(d);

Referencia

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.

John Sheehan
fuente
77
Mucho mejor que Math.Roundya que devuelve un int según sea necesario.
Keith el
10
@ robert-koritnik. No estoy seguro de por qué eso es "inválido". OP no especificó una regla de redondeo preferida, y "redondear .5 al par más cercano" es la regla estándar desde hace mucho tiempo. Siempre redondeando tiene efectos estadísticos no deseados.
Keith
@Keith: No lo sé, pero siempre me han enseñado a redondear x.5 , pero puedo ver el razonamiento para hacerlo hacia arriba o hacia abajo para las estadísticas. Gracias por eso. PD: Está claro que no estoy en estadísticas, finanzas o contabilidad donde este tipo de redondeo parece ser el predeterminado .
Robert Koritnik el
3
"Siempre redondear tiene efectos estadísticos no deseados" - Eso es simplemente falso. Redondear .5 hacia arriba redondea exactamente la mitad de los números [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.
Jim Balter
11
@JimBalter Como el cero no se redondea, el redondeo hacia arriba introduce un sesgo positivo, por lo que se conoce como redondeo asimétrico. La "mitad redondeada a par" no lo hace, si su distribución es suficiente y el redondeo no sesga los números pares o desiguales. Ver redondeo a mitad de camino, desempate .
sdds
36

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.

szymcio
fuente
Esto fue perfecto para mí, ya que Math.Round no funcionaba como yo quería.
Hanna
@cullub sí, lo hace. Convierte el doble d que tenía 0.5 agregado, a un número entero.
Darrell
Este es mi método preferido: funciona de una manera muy simple. Mucho más corto y más fácil de leer que Math.Round (d, MidpointRounding.AwayFromZero) y más conciso que usar una instrucción if para elegir si redondear hacia abajo o hacia arriba. Y, en realidad devuelve un entero en el extremo, no un doble
binderbound
3
Vea el comentario de @ Eternal21 a continuación para ver comportamientos extraños en números negativos (MyRound (-1.2) = 0)
Chris
2
Para cualquiera que se pregunte, el problema mencionado por @Chris ahora se resuelve presumiblemente verificando si el valor es negativo.
John Weisz
14
double d;
int rounded = (int)Math.Round(d);

fuente
5

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 downcasting intsiempre 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 downcast intdebería devolver el valor correcto. (por ejemplo (int)(1.8 + .5) == 2)

Trent
fuente
13
El problema es si intenta convertir valores negativos de esa manera. Por ejemplo, -1.25 terminará igual a 0. (-1.25 + 0.5 = 0.75, y una vez reducido a int es 0). Por lo tanto, debe restar 0.5 de los valores negativos.
Eterno21
Uno puede usar+ 0.5 * Math.Abs(d)
TaW
-1

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));
    }
}

Fuente

public static int RoundToInt(float f) { return (int)Math.Round(f); }
zwcloud
fuente
Q no menciona ni etiqueta la Unidad.
XenoRo
@XenoRo Estaba respondiendo esta vieja pregunta para aquellos que buscan respuestas similares cuando usan Unity.
zwcloud
2
Puede responder sus propias preguntas para compartir conocimientos. Cree una pregunta separada específica para la API (en este caso, Unity) en casos como este. Las respuestas deben ser apropiadas para las preguntas. De lo contrario, podría haber una respuesta aquí para cada API de C # con una función de redondeo.
XenoRo
-2

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.

Mark Jones
fuente
2
¿Acaso esto no redondea todos los números negativos y negativos? Ese no es necesariamente el número entero "más cercano".
Tim Pohlmann el
Este no es el número más cercano.
Samer Aamar
1
Dado 1.99, esto devuelve 1.0.
Jon Schneider