Arredondamento BigDecimal [RESOLVIDO]

Bom Dia,

Como posso arredondar uma divisão com BigDecimal???

Codigo.

BigDecimal resultado = variavel1.divide(variavel2);

Tenho uma divisão onde os valores possuem 4 casas decimais e são exatos, so que mesmo assim não consigo ter o resultado correto…

variavel1 = 9000000.0000
variavel2 = 2000.0000

o resultado seria:

resultado = 4500.0000

so que não é o que acontece, ele fica

resultado = 4503.0000

Alguém pode me ajudar???

Abraços…

Estranho, eu fiz o seguinte teste, repare no comentário:[code] public static void main(String[] args){

	BigDecimal bd1 = new BigDecimal("9000000.0000");
	BigDecimal bd2 = new BigDecimal("2000.0000");
	BigDecimal resultado = bd1.divide(bd2);
	
	System.out.println(resultado); // Imprime 4500

}[/code]

Oi “digaoneves”

Acho que achei aqui,
Estou somando o valor um unitario d produto a mais =/

Vou dar uma verificada aqui, mas acho que o erro seja esse msm!!!

abraço.

Isso mesmo, foi um equivoco aqui no meu codigo…

public ProdutoLocal popularProdutoLocalExistente(ProdutoEstoque produtoEstoque, ERPProduto produto, ProdutoLocal produtoLocal) {
		//Resgata a diferença entre entrada e saida.
		BigDecimal diferencaEntrdaSaida = produtoLocal.getQtdEstoqueEntrada().subtract(produtoLocal.getQtdEstoqueSaida());
		
		//Calcula o valor do patrimonio em estoque.
		BigDecimal valorRealTotal = diferencaEntrdaSaida.multiply(produtoLocal.getCustoMedioAcumulado());
		
		//Acumula valor do patrimonio em estoque.
		BigDecimal acumuladoValorReal = valorRealTotal.add(produtoEstoque.getValorUnitario().multiply(produtoEstoque.getQuantidade()));
		
		//Calculo para achar o custo medio.
		BigDecimal custoMedioAcumulado = acumuladoValorReal.divide(diferencaEntrdaSaida.add(produtoEstoque.getQuantidade())).setScale(4, BigDecimal.ROUND_UP);
		
		produtoLocal.setCustoMedioAcumulado(custoMedioAcumulado);
		
		produtoLocal.setQtdEstoqueEntrada(produtoLocal.getQtdEstoqueEntrada().add(produtoEstoque.getQuantidade()));
		produtoLocal.setQtdEstoqueSaida(produtoLocal.getQtdEstoqueSaida());
		
		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
        Date date = new Date();
        dateFormat.format(date);
        produtoLocal.setDataUltimaAlteracao(DateUtils.getInstance().calendarToInteger(DateUtils.getInstance().convert(dateFormat.format(date))));
		return produtoLocal;
	}

abraços…

Uma dica, implemente quantias de moeda em um wrapper de BigDecimal, como um tipo Money, com uma API mais produtiva que o BigDecimal.

Se tiver muito código de cálculos que requerem precisão, talvez até pensar em usar alguma outra linguagem com suporte nativo à tipos numéricos de precisão infinita, tipo Grails ou Scala.

Outra, esse popularProdutoLocalExistente ficaria melhor dentro da própria instancia do ProdutoLocal a ser populado, como um produtoLocal.popularCom(estoque, erp), por questão que estás trabalhando muito com os internos de um objeto, estando fora dele. Talvez até um new ProdutoLocal(dados, estoque, erp), ou algum builder, se tiver como criá-lo do zero.

Boa Tarde, o erro acima ta resolvido, mas caso eu tenha uma dizima periódica no resultado???

variavel1 = 10000000.0000  
variavel2 = 2000.0000 

BigDecimal resultado = variavel1.divide(variavel2); 

resultado = 3333.3333

Da pau como fica nesse caso, alguém sabe???

Há 6 overloads do método divide e você escolheu justamente o que dá problemas com dízimas periódicas :slight_smile:

http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html

Use algum dos outros. Obviamente você tem de saber, no seu problema, quantas casas você precisa depois da vírgula para sua divisão.

Bom Dia,

A um tempinho conseguir acertar o calculo =p

 variavel1 = 10000000.0000    
variavel2 = 2000.0000   
  
BigDecimal resultado = variavel1.divide(variavel2).setScale(4, BigDecimal.ROUND_HALF_EVEN);   
  
resultado = 3333.3333

Assim seto 4 casas decimais e perco menos para arredondar

Abraços.