Erro de arredondamento?

Galera,
To tentando fazer um cálculo de rateio no java, más acho que ta dando erro de arredondamento, ou sei la. Saca só:

Eu tenho 3 variáveis:
gasto (gasto de uma pessoa)
valortotal (valor total de gastos de todoas as pessoas somados)
valorrateio (valor que precisa ser rateado)

A politica é rateio simples (quem gastar mais recebe mais pelo rateio e vice-e-versa). Logo, fiz o seguinte:

valor do rateio para determinada pessoa é = (gastos / valortotal) * valorrateio;

Até ai tudo bem. Levando em conta que o valortota é 18925.56

O problema é que quando eu somo os gastos de todo mundo o valor fica em 17986.54

Agora, por que eu acho que é problema de arredondamento: Por que quando eu faço o rateio assim:

valor do rateio para determinada pessoa é = valorrateio / numerodepessoas

O VALOR FINAL BATE!!! 18925.56!!!

Algúem consegue me ajudar? Vou postar um pedaço do código pra ver se ajuda.

[code]

while(rs4.next()){

				garbage = new Vector();

				for(int a = 1; a <= 24 ; a++ ){
				garbage.addElement(rs4.getObject(a));
				}
			
				if((garbage.get(15) != null) && (garbage.get(23) == null)){
		
					String valor = trataValor(garbage, 15);
					gastos = gastos + Double.parseDouble(valor);
				}				
			}			

			estevalorrateio = ((gastos / valordanota )* valorrateio);
		
			//estevalorrateio = valorrateio / 61 aki da certo;
			gastos = gastos + estevalorrateio;		
			gastosdocentro = gastosdocentro + gastos;			
		}
		
		gastototalimportacao = gastototalimportacao + gastosdocentro; //esse seria o valor total[/code]

Fala ai vinicius.

Cara eu acho que o erro esta na sua lógica, realmente o Java tem alguns problemas com arredondamente, principalmente se você estiver utilizando objetos do tipo Double, porém eu nunca encontrei casos de arredondamento em que a diferença se aproximasse de 1.000,00 reais, é lógico que eu não sei quais foram os dados utilizados no teste, como número de pessoas por exemplo, e que isso poderia distocer bastante o resultado.

O meu conselho é que você tente debugar o funcionamento do seu código em uma IDE, ou post os valores utilizados no seu teste, lembre-se de realizar um bom teste de mesa para garantir que sua lógica esteja correta.

Olá, se você está trabalhando com valores que precisam ser exatos, não utilize “float” ou “double”. Pesquise sobre BigDecimal.
Mais informações:

  • Item 31 do livro Effective Java;

Também já tive este problema, e isso dava quando utilizava double ou float. As vezes nas multiplicações e divisões, ele dava diferença de 0.000001, o que no final do calculo dá essa diferença que tu mensionou no seu exemplo. A partir daí, comece a usar bigdecimal e sanou meu problema. O BigDecimal tem seus próprios métodos para realizar multiplicações, divisões , adições e subtrações…

Erros de arredondamento o Java tem, mas não tão grotescos assim (17986.54 vs. 18925.56 ). Eu diria que você esqueceu de levar algum fator em conta.