javadoc Oficial says que Math.floor devuelve un doble que es "igual a un número entero matemática", pero entonces ¿por qué no lo devuelva un int?¿Por qué Math.floor devuelve un doble?
Respuesta
Según el mismo javadoc:
Si el argumento es NaN o un infinito o cero o negativo cero positivo, entonces el resultado es el mismo que el argumento. No se puede hacer eso con un int.
El valor doble de grande es también mayor que el mayor int, por lo que tendría que ser mucho.
Es para precisión. El tipo de datos doble tiene una mantisa de 53 bits. Entre otras cosas, eso significa que un doble puede representar todo entero hasta 2^53 sin pérdida de precisión.
Si almacena un número tan grande de un entero obtendrá un desbordamiento. Los enteros solo tienen 32 bits.
Devolver el número entero como un doble es lo correcto, ya que ofrece un rango de números mucho más útil que un número entero.
Podría regresar mucho para hacer frente a tales valores, por supuesto. Aún así, tendrás que decidir qué hacer con los dobles> 2^63. –
@Jon, cierto, pero eso daría como resultado un impacto en el rendimiento (no hay instrucciones de conversión de largo a doble en ningún conjunto de instrucciones del que tenga conocimiento). Me pregunto qué hace Math.floor con los dobles> 2^53 en primer lugar. Algunos resultados no son representables. –
Pero luego, la forma pseudo-idiomática (int) Math.floor (foo), que también aparece en el javadoc oficial es insegura ya que el resultado puede no encajar en un int, ¿estoy en lo cierto? Y una vez más, ¿cuál es una forma segura de utilizar Math.floor, ya que el resultado puede no ajustarse incluso en un largo? – Raibaz
para que el error y otros valores no enteros pueden conectar en cascada correctamente a través de una serie de cálculos.
Por ejemplo, si introduce Not a Number (NaN) en Math.floor, lo pasará.
Si devuelve un número entero, no podría pasar estos estados o errores, y podría obtener malos resultados de un cálculo anterior que se ve bien pero está mal después de un procesamiento posterior.
-Adam
¿Qué le gustaría que vuelva si usted le dio un doble más grande que el más grande int o largo?
(Es cierto que si es más grande que el más grande de largo la precisión será baja de todos modos - puede que no sea el número entero más próximo teórico - pero aún así ...)
Así como no es un entero y un punto flotante división en Java, hay enteros y punto flotante formas de hacerlo baja:
double f = Math.floor(x);
o
int k = (int) x;
pero siempre hay que tener cuidado con el uso de suelo con f Aritmética de precisión de inite: su cálculo de x puede producir algo como 1.99999999 que se ampliará a 1, no a 2 en ambas formas. Hay muchos algoritmos por ahí que necesitan evitar esta limitación para evitar producir resultados incorrectos para algunos valores de entrada.
Esto casi funciona, excepto que (int) -1.5 = -1; – PearsonArtPhoto
Otros han dicho que el por qué, voy a decirle cómo redondear correctamente dado que quiere hacer esto. Si sólo se va a utilizar números positivos, entonces se puede utilizar esta declaración:
int a=(int) 1.5;
Sin embargo, el (int) siempre redondea hacia 0. Por lo tanto, si usted quiere hacer un número negativo:
int a=(int) -1.5; //Equal to -1
En mi caso, yo no quería hacer esto.Utilicé el siguiente código para hacer el redondeo, y parece manejar bien todos los casos extremos:
private static long floor(double a)
{
return Math.round(Math.floor(a));
}
¿Por qué no usar '(int) Math.floor (a)'? Probablemente sea más eficiente y más corto. –
- 1. ¿Por qué Math.Floor (Double) devuelve un valor de tipo Double?
- 2. ¿Por qué Math.ceil devuelve un doble?
- 3. ¿Por qué C# Math.floor() devolver el doble en lugar de Int
- 4. ¿Por qué debería combinar Math.floor con Math.random?
- 5. C# Math.cos (doble) devuelve un valor incorrecto
- 6. ¿Por qué dividir un flotante por un entero devuelve 0.0?
- 7. Math.floor (Math.random()) ¿Qué hace +1 en realidad?
- 8. Explique Math.floor (Math.random())
- 9. Math.ceil y Math.floor volviendo mismo valor
- 10. Android - ¿Por qué onItemLongClick (...) devuelve un booleano?
- 11. ¿Por qué readf no devuelve un valor?
- 12. ¿Por qué devuelve Enum.Parse() un objeto?
- 13. ¿Por qué 'fopen' devuelve un puntero NULL?
- 14. ¿Por qué DateTimeInfo.MonthNames devuelve un miembro 13?
- 15. ¿Por qué Int64.MaxValue devuelve un Long?
- 16. C++ devuelve el puntero doble de la función .... ¿qué pasa?
- 17. ¿Por qué es (doble) 0.6f> (doble) (6/10f)?
- 18. ¿Por qué SelectSingleNode devuelve nulo?
- 19. ¿Por qué Java's Double.compare (doble, doble) está implementado como está?
- 20. ¿Por qué chrome.extension.getBackgroundPage() devuelve nulo?
- 21. ¿Por qué BitmapFactory.decodeByteArray devuelve nulo?
- 22. ¿Por qué ISNUMERIC ('.') Devuelve 1?
- 23. ¿Por qué sys.getrefcount() devuelve 2?
- 24. ¿Por qué navigator.appCodeName devuelve Mozilla?
- 25. ¿Por qué IndexOf devuelve -1?
- 26. ¿Por qué document.GetElementById devuelve nulo
- 27. ¿Por qué Bitmap.getConfig() devuelve nulo?
- 28. ¿Por qué GetCurrentProcess devuelve -1?
- 29. por qué Files.probeContentType devuelve nulo
- 30. ¿Por qué is_array() devuelve falso?
¿Adivina que también se aplica para .Net? – Graviton
parece inconsistente con las funciones Math.Round, que devuelven int/long y manejan los casos especiales de una manera diferente. – zod
Observe que el Javadoc dice que devuelve _ "el mayor valor de coma flotante *** (más cercano al infinito positivo) *** que sea menor o igual que el argumento y que sea igual a un entero matemático" _. Dado un valor _x> 2^53_ que no será el mismo que el valor con su parte fraccionaria truncada. Puede ser bastante más pequeño que eso. –