BigDecimal

7 respostas
Java_Player

Olá,

Tenho um número BigDecimal e quero imprimir ele, mas tirando os zeros insignificantes depois da vírgula. Por exemplo:

BigDecimal b1 = new BigDecimal("100.00000");
BigDecimal b2 = new BigDecimal("100.12300");

System.out.println(b1);
System.out.println(b2);

Quero que a saída seja:
100
100.123

Tentei usar o método stripTrailingZeros(), mas ele imprime:
1E+2
100.123

Também tentei usar DecimalFormat:

DecimalFormat  f  = new DecimalFormat();
f.applyPattern("#,###.#");
System.out.println(f.format(b2));

mas aí eu tenho que dizer quantas casas depois da vígula eu quero, só que eu quero que imprima todas as casas significantes depois da vírgula, independente de quantas tenha.

Alguém sabe uma solução?

7 Respostas

sergiotaborda

Por definição o numero de digitos significantes é constante. Se é 2 é 2 e é sempre 2.
Use DecimalFormat e escolha quantos digitos vc quer. Caso contrário o que vc está fazendo não tem significado.

Java_Player

sergiotaborda:
Por definição o numero de digitos significantes é constante. Se é 2 é 2 e é sempre 2.
Use DecimalFormat e escolha quantos digitos vc quer. Caso contrário o que vc está fazendo não tem significado.

Só estou querendo criar um método utilitário, que tenha como parâmetro um BigDecimal e retorne uma String que represente este número, sem os dígitos insignificantes à direita da vírgula. Será que isso é sem sentido??

Vou precisar de fazer essa gambiarra abaixo?

public String bigDecimalToString(BigDecimal bd){
   DecimalFormat  f  = new DecimalFormat();   
   f.applyPattern("#,###.################################");   
   return f.format(bd);
}
T

No meu tempo de engenheiro um zero à direita da vírgula não era um dígito “insignificante” mas era significante como outro qualquer.

Para os engenheiros, “15.000” é diferente de “15.0” - o primeiro valor foi medido com precisão de 3 casas, o segundo com a precisão de 1 casa decimal.

ViniGodoy

Dá uma olhada aqui:
http://java.sun.com/developer/TechTips/1999/tt0826.html#tip2

sergiotaborda

Sem dúvida. 8)
Mas aqui fica uma forma de resolver seu problema

public String bigDecimalToString(BigDecimal bd){

  if (bd.longValue() / db.doubleValue() == 1){
        // o numero é inteiro
          return Long.toString(bd.longValue());
  }   else {
          return Double.toString(bd.doubleValue());
  } 

}

Este código so funciona quando bd está no range de long e double mas para numeros pequenos deve funcionar

Java_Player

sergiotaborda:

Sem dúvida. 8)
Mas aqui fica uma forma de resolver seu problema

public String bigDecimalToString(BigDecimal bd){

  if (bd.longValue() / db.doubleValue() == 1){
        // o numero é inteiro
          return Long.toString(bd.longValue());
  }   else {
          return Double.toString(bd.doubleValue());
  } 

}

Este código so funciona quando bd está no range de long e double mas para numeros pequenos deve funcionar

Pois é… Estou trabalhando com BigDecimal justamente porque double não resolve.

Quando uso com números pequenos esse seu método funciona. Mas quando usei com o BigDecimal “10000000.5” ele imprimiu “1.00000005E7”.

Além disso, quando usei com o BigDecimal:

9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.9999999999999999999

Ele imprimiu “Infinity”!!

Consegui resolver com o seguinte método: (adaptei a dica do ViniGodoy, trocando while(true) por while(n.scale() > 0) para não ficar imprimindo em notação científica )

static BigDecimal trim(BigDecimal n) {
		try {
			while (n.scale() > 0) {
				n = n.setScale(n.scale() - 1);
			}
		} catch (ArithmeticException e) {
			// no more trailing zeroes so exit.
		}
		return n;
	}

Assim funcionou em todos os casos, e se eu passar o meu salário como parâmetro não vai mais imprimir “Infinity” hehehehe…

Java_Player

Achei uma solução melhor. Basta fazer assim:

BigDecimal b1 = newBigDecimal("100.00000");  
BigDecimal b2 = newBigDecimal("100.12300");  
 
System.out.println(b1.stripTrailingZeros().toPlainString());
System.out.println(b2.stripTrailingZeros().toPlainString());

Valeu.

Criado 31 de agosto de 2007
Ultima resposta 5 de set. de 2007
Respostas 7
Participantes 4