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?
Respuesta
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
.
¿doble es más ancho que el rango de doble? Piensa que quisiste decir mucho tiempo. :) –
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. –
@ 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
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
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. –
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) –
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
Eso es correcto. Al mirar la declaración, Math.Floor (double) arroja un doble (ver http://msdn.microsoft.com/en-us/library/e0b5f0xb.aspx). Supongo que por "entero" quieren decir "número entero".
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.
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;
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
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.
- 1. valor Double devuelve 0
- 2. double double vs double
- 3. printf y double double
- 4. ¿Cómo convierto Double [] a double []?
- 5. por qué math.Ceiling (double a) no devuelve int directamente?
- 6. ¿Por qué Math.floor devuelve un doble?
- 7. double double vs long int
- 8. por qué boost :: call_traits <double> :: param_type es "const double &", mientras que no es "doble"
- 9. Double-dispatch y alternativas
- 10. long double returns y ctypes
- 11. ¿Por qué triplica la tripulación data.table (integer versus double)?
- 12. Double vs doubleValue en Java
- 13. Cómo resolver un problema Java Rounding Double
- 14. double as true/false
- 15. Double-Loop en msbuild?
- 16. ¿Qué hace keySet(). ToArray (nuevo Double [0])?
- 17. C# volatile double
- 18. Java Double Comparison
- 19. Double Negation en C++ código
- 20. Escribir un valor de tipo double a un archivo de texto
- 21. double free or corruption
- 22. MySQL double sort
- 23. GestureOverlayView y Double-Tap
- 24. Double to Const Char *
- 25. jenkins double email
- 26. ¿Por qué IsAssignableFrom() no funciona para int y double?
- 27. Math.Floor vs cast a un tipo integral en C#
- 28. Convertir void * a double
- 29. Cómo convertir un valor de tipo genérico T a double sin boxeo?
- 30. bash double bracket issue
_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
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. –
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. –