Problema com Double

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! :wink:

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! :smiley:

Espero novamente ter ajudado! :wink:

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! :frowning:

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);
	}


}