2013-08-26 29 views
13

Có loại biến thực sự lớn nào tôi có thể sử dụng trong Java để lưu trữ số lượng lớn (tối đa khoảng bốn mươi chữ số) không?Tôi có thể sử dụng loại biến nào để giữ số lớn (30 chữ số) trong java?

long giá trị tối đa là 9223372036854775807, có 19 chữ số - không đủ lớn.

Tôi đang cố gắng để tạo ra một máy tính có thể xử lý một số lượng lớn, bởi vì hiện nay hầu hết chỉ có thể tổ chức một cuộc không đủ 10 chữ số hoặc lâu hơn, và tôi muốn muốn tính toán chính xác với những con số của một cường độ lớn hơn nhiều

EDIT

Cảm ơn câu trả lời. Tôi có thể sử dụng BigInteger cho số nguyên lớn, giới hạn duy nhất là bộ nhớ của máy tính (nên đủ). Đối với số thập phân, tôi sẽ sử dụng float^e, như @WebDaldo đề xuất hoặc BigDecimal (tương tự như BigInteger), như @kocko đề xuất.

Trả lời

19

Bạn có thể sử dụng lớp 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); 

Output:

Sum: 3677593528178171109762168924892318

sản phẩm: 1938839471287900434078965247064711159607977007048190357000119602656

tôi nên đề cập BigDecimal, mà là tuyệt vời đối với số tiền tính toán so sánh với đôi.

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())); 

Output:

$ 123,234,545.48

+0

bạn có biết giá trị lớn nhất của 'BigInteger' là gì không? –

+0

@Jon: Có lẽ ở đâu đó trên 2^1000000. Tùy thuộc vào số lượng bộ nhớ bạn có, thực sự. – cHao

+2

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

11

Bạn có thể thử sử dụng lớp BigInteger cho các hoạt động có số nguyên thực sự khổng lồ.

Đối với các thao tác có số thực, Java cung cấp lớp học BigDecimal, cũng có thể hữu ích.

2

Bạn có thể sử dụng phao^e

vì vậy bạn có thể có

0.55342663552772737682136182736127836782163 * 10^e 

Máy tính đang chủ yếu sử dụng t mũ nữa.

+1

Một java 'float' không phải là độ chính xác tùy ý ... –

+1

Một phao chỉ có khoảng 8 chữ số thập phân chính xác. Bạn có lẽ nên tránh sử dụng nó. – Joni

+1

(http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3) Các loại dấu phẩy động là phao và kép, được liên kết với khái niệm định dạng 64 bit và độ chính xác kép 64 bit chuẩn IEEE 754 và các hoạt động như được quy định trong tiêu chuẩn IEEE cho số học dấu phẩy động nhị phân, ANSI/IEEE Standard 754-1985 (IEEE, New York). – JavaDM

4

Để tính toán với số mũ, như bạn sẽ sử dụng trong máy tính, bạn nên sử dụng BigDecimal. Vấn đề với BigInteger là nó chỉ xử lý số nguyên (không có số phân số) và số thực lớn như 10^100 nó lưu trữ tất cả số 0, sử dụng nhiều bộ nhớ, thay vì sử dụng định dạng dựa trên ký hiệu khoa học.

Bạn có thể sử dụng loại số dấu phẩy động double, cung cấp cho bạn phạm vi giá trị lớn, sử dụng bộ nhớ thấp và hoạt động nhanh.Nhưng vì vấn đề làm tròn và độ chính xác giới hạn (khoảng 16 chữ số thập phân), tôi sẽ không khuyên bạn nên sử dụng nó trừ khi bạn thực sự biết những gì bạn đang làm.

1

Điều này là dành cho tất cả các số lớn hơn trên 15 kể từ khi sử dụng int thổi nó. Bạn có thể muốn tìm giai thừa 50 hoặc 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

Mặc dù mã được đánh giá cao, nó luôn luôn nên có một lời giải thích kèm theo. Điều này không phải là dài nhưng nó được mong đợi. – peterh

+0

Điều này là dành cho tất cả các số lớn hơn trên 15 kể từ khi sử dụng int thổi nó. Bạn có thể muốn tìm giai thừa 50 hoặc 100 0r 500. Công trình này. – kamals1986

+0

public class thừa { \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 trả về BigInteger.ONE; \t \t} else { \t \t \t trả về BigInteger.valueOf (b) .multiply (fatFactorial (b - 1)); \t \t} \t} \t public static void main (String [] args) { \t \t fac thừa = new thừa(); \t \t System.out.println ("Số Fat Sự thật của" + 500 + "=" \t \t \t \t + fac.fatFactorial (500)); \t} } – kamals1986

Các vấn đề liên quan