2013-03-01 11 views
6

Obecnie używam BigDecimal i daje mi to więcej miejsca po przecinku, ale nie na tyle, aby to, co próbuję zrobić. Muszę być w stanie dotrzeć aż do cyfry 10^6. To jest mój aktualny kodZdobądź wszystkie miejsca po przecinku w liczbie po podziale

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

i wyprowadza 3.14159265301190249175533608649857342243194580078125

gdzie liczba rzeczywiście ma dużo więcej miejsca dziesiętne: http://www.wolframalpha.com/input/?i=103993%2F33102

Odpowiedz

15

tracisz precyzji przy ocenie to:

103993/33102.0 

jako podwójny podział. Właściwie, co następuje:

BigDecimal num = new BigDecimal(103993/33102.0); 

jest equivlent do:

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

zamiast zastosowanie:

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

WYJŚCIE:

3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737 
+0

w mojej konsoli eclipse, moje wyjście jest: 3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613 to właśnie to powoduje, że zaćmienie chce wydrukować całość. –

+0

@WillJamieson Musisz wykonać 'scale = 1000000', ale uwierz mi, że zajmie to dużo czasu. –

+0

mam to dzięki! –

3

Problem polega na tym, jak robisz swój numer. Model 103993/33102.0 jest oceniany jako wyrażenie zmiennoprzecinkowe o podwójnej precyzji (double) zanim klasa BigDecimal zostanie włączona. Powinieneś utworzyć osobne obiekty BigDecimal i użyć numeru BigDecimal.divide, aby uzyskać żądany numer.

Ponieważ chcesz uzyskać dokładne wyniki, prawdopodobnie podałbym obie twoje liczby jako liczby całkowite podczas uruchamiania.

Nawet po wykonaniu tej czynności wątpię, czy uda ci się dotrzeć do cyfry 10^6. Być może będziesz musiał zaimplementować swój własny algorytm podziału, aby osiągnąć ten poziom, ponieważ każda rozsądna implementacja arbitralnej matematyki precyzyjnej zatrzyma się na długo przed tym punktem (przynajmniej domyślnie).

+1

jestem całkiem pewny ' BigDecimal' ma tyle prec ision, jak chcesz (możesz po prostu poczekać trochę dłużej, jeśli chcesz więcej precyzji, możesz odpowiednio określić 'scale' w' divide'). – Dukeling

Powiązane problemy