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.
da para usar bigdecimal tb
Alguem poderia me dar um exemplo mais simples de como usar a BigDecimal ?
Obrigado.
thingol
Novembro 11, 2008, 10:23am
#6
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
thingol
Novembro 11, 2008, 10:41am
#8
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
thimor
Novembro 12, 2008, 1:00pm
#11
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