Respostas:
De acordo com o mesmo Javadoc:
Se o argumento for NaN
ou infinito ou zero positivo ou zero negativo, o resultado será o mesmo que o argumento. Não posso fazer isso com um int
.
O maior double
valor também é maior do que o maior int
, então teria que ser a long
.
É para precisão. O tipo de dados duplo tem uma mantissa de 53 bits. Entre outras coisas, isso significa que um duplo pode representar todo o todo até 2 ^ 53 sem perda de precisão.
Se você armazenar um número tão grande em um inteiro, terá um estouro. Os inteiros têm apenas 32 bits.
Retornar o inteiro como um duplo é a coisa certa a se fazer aqui, porque oferece um intervalo de números útil muito mais amplo do que um inteiro.
Outros disseram a você o porquê, vou lhe dizer como arredondar corretamente, já que você deseja fazer isso. Se você pretende usar apenas números positivos, pode usar esta instrução:
int a=(int) 1.5;
No entanto, o (int) sempre é arredondado para 0. Portanto, se você quiser fazer um número negativo:
int a=(int) -1.5; //Equal to -1
No meu caso, eu não queria fazer isso. Usei o seguinte código para fazer o arredondamento e parece que ele trata bem todos os casos extremos:
private static long floor(double a)
{
return (int) Math.floor(a);
}
(int) Math.floor(a)
? Provavelmente é mais eficiente e mais curto.
(int) Math.floor(a)
simplesmente escrever (int) a
, se a for positivo.
Assim como há um inteiro e uma divisão de ponto flutuante em Java, existem maneiras de inteiros e de ponto flutuante de fazer floor:
double f = Math.floor(x);
ou
int k = (int) x;
mas você sempre precisa ter cuidado ao usar floor com aritmética de precisão finita: seu cálculo de x pode render algo como 1.99999999 que será reduzido a 1, não 2 por ambas as formas. Existem muitos algoritmos por aí que precisam contornar essa limitação para evitar a produção de resultados errados para alguns valores de entrada.
Assim, esse erro e outros valores não inteiros podem ser corretamente cascateados por uma série de cálculos.
Por exemplo, se você alimentar Not a Number (NaN) em Math.floor, ele o passará adiante.
Se ele retornasse um número inteiro, não poderia passar esses status ou erros adiante, e você poderia obter resultados ruins de um cálculo anterior que parecem bons, mas estão errados após o processamento posterior.