2013-08-26 14 views
13

Czy istnieje naprawdę duży typ zmiennej, której mogę używać w Javie do przechowywania dużych liczb (do około czterdziestu cyfr)?Jakiego typu zmiennej można użyć do przechowywania dużych liczb (ponad 30 cyfr) w języku Java?

long Maksymalna wartość to 9223372036854775807, czyli 19 cyfr - nie jest wystarczająco duża.

Próbuję stworzyć kalkulator, który może obsłużyć dużych ilościach, ponieważ większość dzisiejszych czasach może posiadać tylko niedostateczną 10 cyfr lub więcej, i chcę chcą dokładnych obliczeń z liczbą dużo większą skalę

EDIT

Dzięki za odpowiedzi. Mogę używać BigInteger dla dużych liczb całkowitych, jedynym ograniczeniem jest pamięć komputera (powinna być wystarczająca). Dla ułamków dziesiętnych użyję float^e, jak zasugerował @WebDaldo, lub BigDecimal (podobnie jak BigInteger), jak zasugerował @kocko.

Odpowiedz

19

Można użyć klasy BigInteger.

BigInteger bi1 = new BigInteger("637824629384623845238423545642384"); 
BigInteger bi2 = new BigInteger("3039768898793547264523745379249934"); 

BigInteger bigSum = bi1.add(bi2); 

BigInteger bigProduct = bi1.multiply(bi2); 

System.out.println("Sum : " + bigSum); 
System.out.println("Product : " + bigProduct); 

wyjściowa:

Suma: 3677593528178171109762168924892318

produktu: 1938839471287900434078965247064711159607977007048190357000119602656

powinienem wspomnieć BigDecimal, która jest doskonała dla obliczenia kwota porównać do podwójnym.

BigDecimal bd = new BigDecimal("123234545.4767"); 
BigDecimal displayVal = bd.setScale(2, RoundingMode.HALF_EVEN); 

NumberFormat usdFormat = NumberFormat.getCurrencyInstance(Locale.US);   
System.out.println(usdFormat.format(displayVal.doubleValue())); 

wyjściowa:

$ 123,234,545.48

+0

czy wiesz, jaka jest największa wartość 'BigInteger'? –

+0

@Jon: Prawdopodobnie gdzieś powyżej 2^1000000. Zależy od tego, ile masz naprawdę pamięci. – cHao

+2

@Jon To '(2^32)^(2^31-1)'. – arshajii

11

Możesz spróbować użyć klasy BigInteger do operacji z naprawdę dużymi liczbami całkowitymi.

W przypadku operacji z liczbami zmiennymi Java udostępnia klasę BigDecimal, która również może być przydatna.

2

Można użyć pływak^e

więc można mieć

0.55342663552772737682136182736127836782163 * 10^e 

Kalkulatory są najczęściej korzystają t kapelusz też.

+1

"float" java nie jest dowolną precyzją ... –

+1

Pływak zawiera tylko około 8 cyfr po przecinku. Prawdopodobnie powinieneś go unikać. – Joni

+1

(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) Typy zmiennoprzecinkowe są zmiennoprzecinkowe i podwójne, które są koncepcyjnie powiązane z 32-bitowe i podwójnie precyzyjne 64-bitowe wartości IEEE 754 formatu IEEE 754 o pojedynczej precyzji i operacjach określonych w normie IEEE dla binarnej arytmetyki zmiennoprzecinkowej, norma ANSI/IEEE 754-1985 (IEEE, Nowy Jork). – JavaDM

4

Do obliczeń z wykładnikami, jak w przypadku kalkulatora, należy użyć BigDecimal. Problem z BigInteger polega na tym, że obsługuje tylko liczby całkowite (bez liczb ułamkowych), a dla naprawdę dużych liczb, takich jak 10^100, przechowuje wszystkie zera, używając dużej ilości pamięci, zamiast używać formatu opartego na notacji naukowej.

Można również użyć liczby zmiennoprzecinkowej typu double, która zapewnia szeroki zakres wartości, niskie zużycie pamięci i szybkie operacje.Ale ze względu na problemy z zaokrąglaniem i ograniczoną precyzję (około 16 cyfr dziesiętnych), nie polecałbym jej używania, chyba że naprawdę wiesz, co robisz.

1

Dotyczy to wszystkich większych numerów powyżej 15, ponieważ użycie int powoduje ich przekroczenie. Możesz odszukać silnię 50 lub 100 0r 500.

// Recursive version of the Fat factorial for bigger numbers ex: Factorial of 500  
BigInteger fatFactorial(int b) { 
    if (BigInteger.ONE.equals(BigInteger.valueOf(b)) 
     || BigInteger.ZERO.equals(BigInteger.valueOf(b))) { 
      return BigInteger.ONE; 
    } else { 
     return BigInteger.valueOf(b).multiply(fatFactorial(b - 1)); 
     } 
    } 
+4

Chociaż kod jest doceniany, powinien zawsze mieć towarzyszące wyjaśnienie. To nie musi długo potrwać, ale jest spodziewane. – peterh

+0

To jest dla wszystkich większych liczb powyżej 15, ponieważ użycie int go wieje. Możesz znaleźć silnię 50 lub 100 0r 500. To działa. – kamals1986

+0

Klasa publiczna czynnikowe { \t BigInteger fatFactorial (int b) { \t \t if (BigInteger.ONE.equals (BigInteger.valueOf (b)) \t \t \t \t || BigInteger.ZERO.equals (BigInteger.valueOf (b))) { \t \t \t return BigInteger.ONE; \t \t} else { \t \t \t powrotu BigInteger.valueOf (B) .multiply (fatFactorial (B - 1)); \t \t} \t} \t publiczne statyczne pustych główne łańcuchowe ([] arg) { \t \t czynnikowa FAC = nowy czynnikowa(); \t \t System.out.println ("tłuszcz Liczby Fakt" + 500 + "=" \t \t \t \t + fac.fatFactorial (500)); \t} } – kamals1986

Powiązane problemy