Javadoc oficial diz que Math.floor()
retorna um double
que é "igual a um inteiro matemático", mas então por que não deveria retornar um int
?
104
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.
fonte
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:
No entanto, o (int) sempre é arredondado para 0. Portanto, se você quiser fazer um número negativo:
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:
fonte
(int) Math.floor(a)
? Provavelmente é mais eficiente e mais curto.(int) Math.floor(a)
simplesmente escrever(int) a
, se a for positivo.O que você gostaria que ele retornasse se desse a ele um dobro maior do que o maior int ou longo?
(Admitidamente, se for maior do que o maior longo, a precisão será baixa de qualquer maneira - pode não ser o número inteiro teórico mais próximo - mas mesmo assim ...)
fonte
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:
ou
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.
fonte
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.
fonte