Tratamento de campos double

3 respostas
A

Pessoal,

Eu construí um sisteminha para controle financeiro. Está quase tudo perfeito, só estou com problemas nas pequenas diferenças de centavos.

Criei a minha base (MySQL) com gravando os valores como tipo DOUBLE. Quando eu simplesmente leio a base e mostro o campo valor na tela, aparece tudo certo, mas quando tenho que fazer algum cálculo, ocorre difereças de centavos.

Pesquisando, identifiquei que em algumas vezes um cálculo simples como a soma de um valor positivo com um valor negativo, ambos com duas casas decimais, acaba gerndo um resultado com N casas decimais.

Resumindo, o cálculo não é com double não é exato.

Alguém pode me dar uma dica de como devo proceder para efetuar cálculos exatos com valores, ou seja, com números com casas decimais?

Será que devo armazenar os valores em outro formato no MySQL ou tratar esses campos de outra forma no JAVA?

Grato,

3 Respostas

rugi

Você deve usar BigDecimal

http://www.javamexico.org/blogs/luxspes/por_que_usar_bigdecimal_y_no_double_para_calculos_aritmeticos

:slight_smile:


RuGI

renamed

Oi,

Isso já gerou alguns tópicos aqui no GUJ.
Se vc tiver um tempo, dá uma lida nesse blog: Evite float e double se você quer respostas exatas.

E, como nosso amigo acima falou, utilize BigDecimal. Mas evite passar um double pelo construtor, ou você cairá no mesmo problema.
public static void main(String[] args) {
		
		BigDecimal valor1 = new BigDecimal(1.95);
		BigDecimal valor2 = new BigDecimal(1.32);
		
		System.out.println(valor1.subtract(valor2)); // Valor impresso: 0.6299999999999998934185896359849721193313598632812500
	}
Ao invés, passe uma String
public static void main(String[] args) {
		
		BigDecimal valor1 = new BigDecimal("1.95");
		BigDecimal valor2 = new BigDecimal("1.32");
		
		System.out.println(valor1.subtract(valor2)); // Valor impresso: 0.63
	}

ok?

manhanijava

eu trato estes campos no java, utilizo double, mas tanto pra mostrar quanto pra gravar eu aplico um decimal format, e evitando essa dizima…

Criado 24 de junho de 2010
Ultima resposta 24 de jun. de 2010
Respostas 3
Participantes 4