Formatar Double sem perder precisão!

Bom dia,

Gostaria da ajuda de alguem pois tenho um valor double assim:

1253,198521315421

Eu gostaria que a formatação não perdesse a precisão assim:

1253,19

Eu pesquisei aqui no forum, já usei NumberFormat, DecimalFormat etc… só que eles me retornaram um valor arrendondado (1253,20). Gostaria de saber como faço pra formatar esse valor sem perder a precisão.

Obrigado.

utilize a BigDecimal

abraços!

da para usar bigdecimal tb

http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html#setMinimumFractionDigits(int)

Alguem poderia me dar um exemplo mais simples de como usar a BigDecimal ?

Obrigado.

1253,198521315421 -> 1253,20 (você arredondou errado).

Ve se isso resolve

import java.math.BigDecimal;

public class Big {

	public static void main(String[] args) {
		Double d = 1253.198521315421;
		BigDecimal b = new BigDecimal(d);
		System.out.println(b.setScale(2, BigDecimal.ROUND_DOWN));
		// vai imprimir 1253.19
	}
}

[]s

Se você concordar comigo, o valor 1253.20 é uma aproximação melhor para o valor 1253,198521315421 que 1253,19 (ou seja, é um valor mais exato).

A precisão está relacionada com o número de casas (no seu caso 2 casas de precisão depois da vírgula), portanto você com certeza irá perder precisão.

A exatidão está relacionada com a proximidade do valor representado para o valor real, portanto 1253.20 é mais exato que 1253.19.

Fala galera, usei o BigDecimal, so que alguns campos ele faz a formatação certa e alguns ele arredonda o valor. O que eu faço? Obriagado.


                                double quantidadeCotaPatrocP = Double.parseDouble(lstDadosComprovante.get(0).getValorCotaEmpTribP());
		double quantidadeCotaPatrocK = Double.parseDouble(lstDadosComprovante.get(0).getValorCotaEmpTribK());
		double totalQuantidadeCotaPartc = quantidadeCotaPatrocP + quantidadeCotaPatrocK;
		double valorCotaPatroc = Double.parseDouble(lstDadosComprovante.get(0).getValorCotaRtEmp());
		double valorBrutoPatrocP = quantidadeCotaPatrocP * valorCotaPatroc;
		double valorBrutoPatrocK = quantidadeCotaPatrocK * valorCotaPatroc;
		double totalValorBrutoPatroc = valorBrutoPatrocP * valorBrutoPatrocK;
		double valorPercentualContrPatrocP = Double.parseDouble(lstDadosComprovante.get(0).getValorCotaEmpP());
		double valorPercentualContrPatrocK = Double.parseDouble(lstDadosComprovante.get(0).getValorCotaEmpK());
		double totalPatrocP	= valorBrutoPatrocP * valorPercentualContrPatrocP /100;
		double totalPatrocK	= valorBrutoPatrocK * valorPercentualContrPatrocK /100;
		double totalPatroc	= totalPatrocP + totalPatrocK;
		double valorTributavel = totalPartic + totalPatroc;
		double abatimentoIR = Double.parseDouble(lstDadosComprovante.get(0).getValorIRRF());
		double outrosAbatimentos= Double.parseDouble(lstDadosComprovante.get(0).getValorDebito());
		double valorLiquidoResgate = (valorTributavel - abatimentoIR - outrosAbatimentos); 
			
		
		//Formata valores Participante
                                BigDecimal vbpP = new BigDecimal(valorBrutoPartP);
                                String valorBrutoPartFormatP = String.valueOf(vbpP.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal vbpK = new BigDecimal(valorBrutoPartK);
		String valorBrutoPartFormatK = 	String.valueOf(vbpK.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal vbpV = new BigDecimal(valorBrutoPartV);
		String valorBrutoPartFormatV = 	String.valueOf(vbpV.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal vbpE = new BigDecimal(valorBrutoPartE);
		String valorBrutoPartFormatE = 	String.valueOf(vbpE.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal tvbpf = new BigDecimal(totalValorBrutoPart);
		String totalValorBrutoPartFormt = String.valueOf(tvbpf.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal tpfP = new BigDecimal(totalParticP);
		String totalParticFormatadoP =  String.valueOf(tpfP.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal tpfK = new BigDecimal(totalParticK);
		String totalParticFormatadoK =  String.valueOf(tpfK.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal tpfV = new BigDecimal(totalParticV);
		String totalParticFormatadoV =  String.valueOf(tpfV.setScale(2, BigDecimal.ROUND_DOWN));
		BigDecimal tpfE = new BigDecimal(totalParticE);
		String totalParticFormatadoE =  String.valueOf(tpfE.setScale(2, BigDecimal.ROUND_DOWN));

se vc souber exatamente o nr de decimais q o valor tem, vc pode usar

double valor = 1234.123456789012; // 12 decimais DecimalFormat df = new DecimalFormat(); df.setMinimumFractionDigits(12); System.out.println(df.format(valor)); // 1.234,12346578912

Passei por um problema de arredondamento quando estava pagando uma discliplina onde tinhamos que resolver problemas da maratona de programacao. O problema problematico foi o “The Trip”.

A solucao para o arredondamento eh vc trabalhar com inteiro. 1253,19 vc multiplica por 100 ou por 1000. faz suas operacoes e o resultado voce divide pelo fator que multiplicou. entendeu?

grato,
Thiago moreno