2009-08-28 13 views
80

Necesito obtener el valor entero del lado izquierdo de un decimal o doble. Por ejemplo: necesito obtener el valor 4 de 4.6. Intenté usar la función Math.Floor pero está devolviendo un valor doble, por ejemplo: está devolviendo 4.0 de 4.6. La documentación de MSDN dice que devuelve un valor entero. ¿Me estoy perdiendo de algo? ¿O hay una forma diferente de lograr lo que estoy buscando? Gracias.¿Por qué Math.Floor (Double) devuelve un valor de tipo Double?

+1

_La documentación de MSDN dice que devuelve un valor entero_. [Documentación de MSDN] (http://msdn.microsoft.com/en-us/library/e0b5f0xb (v = vs.110) .aspx) indica que Math.Floor devuelve System.Double, no entero. – broadband

+0

Un valor entero *** *** es efectivamente necesario, pero no significa que pueda almacenarse en "int" o "long".Un "doble" almacena con éxito todos los valores enteros en una gama mucho más amplia que simplemente "int" en cuenta que algunos valores enteros pueden ser redondeados cuando la parte de mantisa no tiene suficientes bits para almacenar todos los dígitos del valor entero, cuando su base-2 el exponente va por encima de 52: este redondeo de valores enteros en "doble" puede ocurrir para enteros superiores a 2^52 o inferiores a -2^52 pero el resultado seguirá siendo el entero entero más representable; si usa "(largo) Piso (x)", la conversión podría ser errónea. –

+0

Nota sin embargo que el rango válido de vallues enteros que pueden estar representados en un "doble" es extremadamente grande, con valores absolutos hasta: (1 + (1 - 2^-52)) x 2^1023 ≈ 1.7976931348623157E308; es mucho más que 2^63-1 con "largo". Sin embargo, el intervalo de números enteros que pueden todos ser almacenado claramente es más restringida, debido a que un "doble" solamente dispone de 52 bits para la mantisa (además de 1 bit implícito para el bit más significativo, no almacenada), lo que significa que "doble" puede almacenar solo enteros exactamente solo cuando su valor absoluto está por debajo de 2^53. –

Respuesta

111

El rango de double es mucho más amplio que el rango de int o long. Considere este código:

double d = 100000000000000000000d; 
long x = Math.Floor(d); // Invalid in reality 

El entero está fuera del rango de long - Entonces, ¿qué se puede esperar que suceda?

Normalmente, usted sabe que el valor será realidad estar dentro del rango de int o long, por lo que lo lanzas:

double d = 1000.1234d; 
int x = (int) Math.Floor(d); 

pero la responsabilidad de ese reparto es en el desarrollador, no en Math.Floor propio . Hubiera sido innecesariamente restrictivo hacer que simplemente fallara con una excepción para todos los valores fuera del rango de long.

+0

¿doble es más ancho que el rango de doble? Piensa que quisiste decir mucho tiempo. :) –

+1

Floor devuelve la representación entera del doble, y devuelve el doble para cálculos científicos, esta respuesta no es correcta porque el doble tiene 64 bits y long también tiene 64 bits, pero el doble no puede almacenar dígitos exactos de bits significativos inferiores incluso si puede ser almacenado correctamente en largo. –

+1

@ Jon: ¿cómo es que no ha intervenido en el encendido debate sobre cómo hacer que un número positivo negativo en C# ?: http://stackoverflow.com/questions/1348080/convert-a-positive-number-to- negative-in-c – MusiGenesis

10

Según MSDN, Math.floor (doble) devuelve un doble: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx

Si desea como un int:

int result = (int)Math.Floor(yourVariable); 

puedo ver cómo el artículo de MSDN puede ser engañoso, que debería haber especificado que, si bien el resultado es un "entero" (en este caso, significa número entero) todavía es de TYPE Doble

+0

Gracias por su respuesta. En realidad estaba mirando este artículo: http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx Pero de todos modos, intentaré su sugerencia. Gracias. –

+0

Bien cierto, sí dice en la parte superior "devuelve un entero", pero el tipo que se especifica a continuación: doble suelo static (double d) –

+3

número entero = 'int' (http://www.answers.com/integer!) - los enteros * pueden * almacenarse en 'Doble' (ver la respuesta de Jon), y hay un número infinito de enteros que no pueden almacenarse en un' int'. – Shog9

0

Floor lo deja como un doble para que pueda hacer más cálculos dobles con él. Si lo quiere como int, emita el resultado de floor como int. No copie el doble original como un int porque las reglas para el piso son diferentes (IIRC) para los números negativos.

4

Si solo necesita la parte entera de un número, envíe el número a int. Esto truncará el número en el punto decimal.

double myDouble = 4.6; 
int myInteger = (int)myDouble;
+1

Es importante tener en cuenta que la conversión a 'int' se comporta de forma diferente a' Floor', para números negativos. 'Floor' siempre se truncará al número más negativo, mientras que la conversión a' int' se truncará hacia 0. – Magnus

0
Convert.ToInt32(Math.Floor(Convert.ToDouble(value))) 

Esto le dará el valor exacto lo que quiere como si se toma 4.6 vuelve 4 como salida.