Erro de arredondamento?

4 respostas
viniciusfaleiro

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.

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

4 Respostas

leandro.anjos

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.

M

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;
L

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…

T

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.

Criado 5 de maio de 2008
Ultima resposta 6 de mai. de 2008
Respostas 4
Participantes 5