Problema com NumberFormat

5 respostas
Andre_Donadon

E aí galera beleza???

será que alguém pode me ajudar??? eu já vi vários tópicos, li tutoriais e o guia de API da sun… mas ainda não consegui resolver meu problema

NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumIntegerDigits( 25 );
		
System.out.println( nf.format( dqtdePecas ) );

onde dqtdePecas é um double que está recebendo o valor de 2 elevado a 64… o valor é 18446744073709551616… se eu não tento formatar… ele me traz esse resultado: 1.8446744073709552E19 e se eu faço do jeito do código… ele faz o seguinte: 18.446.744.073.709.552.000

Reparem bem nas 4 ultimas casas… ele aproxima um valor inteiro…
como posso fazer aparecer esse valor na tela 18446744073709551616???

Valeu aí!!!

5 Respostas

panachi

Olá André,

O double não vai ter essa precisão para um número desse tamanho.

Mas você pode usar um java.math.BigInteger que vai resolver o problema.

T+

furutani
Se você precisa de números decimas use o BigDecimal. Ex.
BigDecimal numero = BigDecimal.valueOf(18446744073709551616D);
		
		NumberFormat nf = NumberFormat.getCurrencyInstance(new Locale("pt", "BR"));
		System.out.println(nf.format(numero));
A saida será
"Console":
R$ 18.446.744.073.709.552.000,00
Andre_Donadon

E ae galera…

Então… nesse caso eu não preciso de decimais… preciso que ele imprima o valor de:
Eu tenho 64 “buracos”, no 1º buraco eu coloco uma semente, no buraco seguinte eu coloco o dobro de sementes do anterior… não sei se a lógica está certa, eu fiz assim:

long valor = 1;
long multi = 1;
      
for ( int i = 1; i < 64; i++ ) {
    if ( i == 1 ) {
        continue;
    }
         
    multi = multi * 2;
    valor += multi;
}

System.out.println( "Valor apresentado: " + BigInteger.valueOf( valor ) );

// Valor apresentado: 9223372036854775807

realmente o double não armazena essa quantidade de bites, vocês podem me dar um idéia se tem como fazer e se eu estou fazendo da melhor forma com o BigInteger??

porque se for 65 buracos, o resultado é -1…

Valeu, abraço!!!

T

Você precisa usar o BigInteger para fazer as contas, já que um long só consegue armazenar até 2 ^63 - 1 = 9223372036854775807.

BigInteger valor = BigInteger.ONE;
BigInteger multi = BigInteger.ONE;
      
for ( int i = 1; i < 64; i++ ) {
    if ( i == 1 ) {
        continue;
    }
         
    multi = multi.multiply (new BigInteger("2");
    valor = valor.add (multi);
}

System.out.println( "Valor apresentado: " + BigInteger.valueOf( valor ) );

// Valor apresentado: 9223372036854775807
panachi

Exatamente, não adianta usar long ou double para acumular os valores e depois usar um BigDecimal ou BigInteger para “formatar” o resultado. Você precisa usar um BigXXX no processo inteiro para não perder a precisão que você deseja.

T+

Criado 12 de abril de 2008
Ultima resposta 19 de abr. de 2008
Respostas 5
Participantes 4