2013-03-01 8 views
6

Attualmente sto usando il BigDecimal e mi sta dando più decimali ma non abbastanza per quello che sto cercando di fare. Devo essere in grado di arrivare fino alla 10^6 cifra. Questo è il mio codice correnteOttieni tutti i decimali in un numero dopo la divisione

BigDecimal num = new BigDecimal(103993/33102.0); 
    pw.println(num.toString()); 

ed emette 3,14159265301190249175533608649857342243194580078125

dove il numero è in realtà molto di più decimali: http://www.wolframalpha.com/input/?i=103993%2F33102

risposta

15

si stanno perdendo la precisione quando si valuta questo:

103993/33102.0 

come una doppia divisione. In realtà, il seguente:

BigDecimal num = new BigDecimal(103993/33102.0); 

è equivlent a:

double d = 103993/33102.0; 
BigDecimal num = new BigDecimal(d); 

invece, l'uso:

int scale = 100; 
BigDecimal num1 = new BigDecimal(103993); 
BigDecimal num2 = new BigDecimal(33102); 
System.out.println(num1.divide(num2, scale, RoundingMode.HALF_UP).toString()); 

USCITA:

3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737 
+0

nella mia console di eclissi, la mia uscita è: 3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613 è che solo causa il dos di eclissi che vuole stampare tutto il tutto fuori –

+0

@WillJamieson È necessario fare 'scale = 1000000', ma credetemi ci vorrà molto tempo. –

+0

capito grazie! –

3

Il problema è come si sta procedendo il tuo numero. Lo 103993/33102.0 viene valutato come un'espressione in virgola mobile a precisione doppia (double) prima che la classe BigDecimal venga coinvolta. È necessario creare oggetti separati BigDecimal e utilizzare BigDecimal.divide per ottenere il numero desiderato.

Poiché si desidera ottenere risultati esatti, probabilmente passare entrambi i numeri come numeri interi all'avvio.

Anche dopo averlo fatto, dubito che sarete in grado di ottenere il 10^6 cifre. Potrebbe essere necessario implementare il proprio algoritmo di divisione per raggiungere quel livello, poiché qualsiasi implementazione sana di matematica di precisione arbitraria si fermerà molto prima di quel punto (almeno per impostazione predefinita).

+1

Sono piuttosto sicuro che ' BigDecimal' ha più prec isione come vuoi che abbia (potresti aspettare ancora un po 'se vuoi più precisione, puoi specificare 'scale' appropriatamente in' divide'). – Dukeling