Estou desenvolvendo uma aplicação comercial que lê muitos números do banco de dados e faz algumas contas com eles (adição, subtração, etc).
O problema é que (incrivelmente) as contas feitas dão resultado errado!Por exemplo, uma conta que era pra dar 94.70 ta dando 94.69999999999999, e uma que era pra dar 10 ta tando 10.0000000001.
O diferença é mínima, mas eu não posso apresentar esses números na interface com usuário pro cliente! Mesmo porque esses números representam dinheiro.
Fiz um programinha teste pra conferir se o problema não vinha do banco de dados, e realmente não vem!
Vejam:
public class Teste {
public Teste() {
double d1 = 12.7 * 2;
double d2 = 9.9 * 7;
System.out.println(d1 + d2);
}
public static void main(String[] args) {
new Teste();
}
}
Se alguém tiver alguma luz, eu agradeço!
Valeu!
Use o método round da classe Math para arredondar os valores!
public class Teste {
public Teste() {
double d1 = 12.7 * 2;
double d2 = 9.9 * 7;
System.out.println(d1 + d2);
System.out.println(Math.round(d1 + d2));
}
public static void main(String[] args) {
new Teste();
}
}
Espero ter colaborado! 
Pedro, valeu a intenção mas isso não resolve meu problema porque ele arredonda 94.69999999 pra 95 e eu preciso de 94.70!
Este link também pode te ajudar! Não deixe de ver! 
Espero novamente ter ajudado! 
Pedro, valeu! O link ajudou!
O problema é que vou ter que formatar os números toda hora. Sem falar que o format retorna String, o que vai me obrigar a fazer parse de volta quando quiser fazer conta.
Mas se o jeito é esse, td bem!
De qualquer maneira, muito obrigado pela atenção!
Não use double e float quando estiver manipulando valores monetários ou quiser respostas exatas. Nesses casos use BigDecimal.
Esse link explica o problema:
http://www.jeebrasil.com.br/mostrar/47
[]s
Valeu Allan!
Vai ser chato pra caramba usar BigDecimal, mas pelo que li tem que ser! 
Valeu d+!
Já sofri por causa disso rsrsrs
[]s
Uma coisa que faço é criar uma classe utilitaria, e colocar os metodos staticos.
Assim não precisa ficar criando toda hora, basta chamar a classe
ex.
public final class NumberUtils {
/**
* Arredonda o double passado com o nrCasas de precisao especificado.
*
* O metódo utilizado que visa diminuir os erros
* de arredondamento acumulados.
* Ex: round(2.335, 2) = 2.33
* round(2.345, 2) = 2.35
*
* @param numero numero double
* @param nrCasas nr de casas
* @return um double arredondado.
*/
public static double round(double numero, int nrCasas) {
return round(numero, nrCasas, BigDecimal.ROUND_HALF_UP);
}
public static double round(double numero) {
return round(numero, 2, BigDecimal.ROUND_HALF_UP);
}
}