Arredondamento de Valores

Boa Tarde,

Tenho o seguinte problema, tenho um relatorio que me informa o total de compra de cada pessoa, entao tenho algo parecido

Eduardo R$ 56.20
Maria R$ 25.89

E outro relatorio que detalha as compras exemplo

Eduardo
Arroz R$ 20.87
Feijão R$ 10.81
Macarão R$ 25.25

TOTAL R$ 56.90

Entendeu por causa das casas decimais em um relatorio ele me passa um valor em outro é outro valor… É algo com as casas decimais, qual a melhor forma de solucionar, uso um banco em ORACLE, andei vendo o BIGDECIMAL… QUAL A MELHOR MANEIRA…??

Nossa, isso não está cheirando bem, não era pra estar dando tanta diferença… Qual o formato destes campos nas suas tabelas!?

Acho que pode ser que a formatacao no ireport um esta currency e outro está apenas ##,# 000,00, será que pode ser??

hummm…
até pode…
mas pra ter certeza, não fique misturando as cosias manipulando formatos de um lado para outro…
leia tudo como String por exemplo, converta para double com Double.parseDouble, faça as contas, TODAS ELAS, e depois jogue o resultado para o ireport :slight_smile:

Falou!

não use double, use BigDecimal… garantia de precisão pra vc :slight_smile:

Cara, me explica isso?! É que não consigo entender porque, já que as contas usam apenas duas casas decimais, a precisão ficaria prejudicada ao se usar double…

Abraço!

é porcausa do modo que o número fica representado em sua forma binária, o ponto flutuante não é lá aquela coisa mesmo…

se vc precisa de resultados exatos, é BigDecimal que vc procura.

faça o teste:


package teste.guj;

import java.math.BigDecimal;

public class TestePrecisao {
	public static void main(String[] args) {
		System.out.println(0.3 + 0.3 + 0.3);
		System.out.println(0.3d + 0.3d + 0.3d);
		System.out.println(new BigDecimal("0.3").add(new BigDecimal("0.3")).add(new BigDecimal("0.3")));
	}
}

ps: 0.3d é double né? estou na dúvida… :stuck_out_tongue: mas rodou então deve ser sim hehehe

[edit]
aliás, deve ter algo bem errado nessa sua conta aí mesmo… fazendo a conta o resultado da compra do meu xará devia ser R$ 56,93…

meu… axei a solução pros meus problemas… 8)

tava quebrando cabeça pra resolver um problema com descontos que são concedidos no sistema q eu estou desenvolvendo, e estava dando muita diferença…

Abraços…

Este assunto já foi tema de uma edição da revista MundoJava.

Sempre que formos trabalhar com valores monetários em Java devemos usar a classe java.math.BigDecimal. Os métodos desta classe manipulam os valores como o bom e velho Cobol, usando lógica decimal (lógica humana). A classe java.lang.Double e seu primitivo manipula os valores usando lógica de ponto flutuante e assim gera erros de precisão durante os cálculos decimais.