Uma forma mais eficiente de arredondar um número double para N casas depois da vírgula segue abaixo.
Note que há o seguinte problema, que é inevitável devido ao funcionamento do ponto flutuante no computador (e não importa o que você faça, é possível provar matematicamente que isso vai acontecer): volta e meia, o arredondamento para um double irá retornar um número que, impresso pelo Java, não terá o número desejado de casas decimais depois da vírgula. Outra coisa que você deve lembrar é que um double não guarda dentro de si a informação de quantas casas devem ser impressas dentro da vírgula. Você vai perceber isso quando olhar os casos “8” e “9” do programa abaixo.
public class TesteArredondamento {
private static double potencias10[] = {
1,
1E+1, 1E+2, 1E+3, 1E+4, 1E+5, 1E+6, 1E+7, 1E+8, 1E+9, 1E+10, 1E+11, 1E+12, 1E+13, 1E+14, 1E+15
};
public static double arredondar (double valor, int ncasas) {
if (ncasas > 15)
return valor;
else if (ncasas < 0)
ncasas = 0;
return Math.round (valor * potencias10[ncasas]) / potencias10[ncasas];
}
public static void main (String[] args) {
double d = 1.2345678901234567890;
System.out.println ("d = " + d);
for (int n = 0; n < 15; n++) {
System.out.println ("d com " + n + " casas = " + arredondar (d, n));
}
}
}
A saída dele é:
d = 1.2345678901234567
d com 0 casas = 1.0
d com 1 casas = 1.2
d com 2 casas = 1.23
d com 3 casas = 1.235
d com 4 casas = 1.2346
d com 5 casas = 1.23457
d com 6 casas = 1.234568
d com 7 casas = 1.2345679
d com 8 casas = 1.23456789
d com 9 casas = 1.23456789
d com 10 casas = 1.[telefone removido]
d com 11 casas = 1.[telefone removido]
d com 12 casas = 1.234567890123
d com 13 casas = 1.2345678901235
d com 14 casas = 1.23456789012346