2013-03-01 29 views
6

Tôi hiện đang sử dụng BigDecimal và nó mang lại cho tôi nhiều số thập phân hơn nhưng không đủ cho những gì tôi đang cố gắng làm. Tôi cần để có thể nhận được tất cả các cách để 10^6 chữ số. Đây là mã hiện tại của tôiNhận tất cả các vị trí thập phân trong một số sau khi chia

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

và nó ra 3,14159265301190249175533608649857342243194580078125

nơi số thực sự có rất nhiều số thập phân: http://www.wolframalpha.com/input/?i=103993%2F33102

Trả lời

15

Bạn đang mất độ chính xác khi đánh giá này:

103993/33102.0 

như một bộ phận kép. Trên thực tế, sau đây:

BigDecimal num = new BigDecimal(103993/33102.0); 

là equivlent tới:

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

thay vào đó, sử dụng:

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

OUTPUT:

3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613316415926530119026040722614947737 
+0

trong giao diện điều khiển nhật thực của tôi, đầu ra của tôi là: 3.1415926530119026040722614947737296840070086399613316415926530119026040722614947737296840070086399613 là chỉ gây ra nhật thực dosent muốn in toàn bộ điều ra –

+0

@WillJamieson Bạn cần phải thực hiện 'scale = 1000000', nhưng tôi tin rằng nó sẽ mất một thời gian dài. –

+0

đã cảm ơn! –

3

Vấn đề là làm thế nào bạn đang làm cho số điện thoại. 103993/33102.0 được đánh giá dưới dạng biểu thức dấu chấm động chính xác kép (double) trước khi lớp BigDecimal được tham gia. Bạn nên tạo riêng các đối tượng BigDecimal và sử dụng BigDecimal.divide để nhận số bạn muốn.

Vì bạn muốn kết quả chính xác, tôi có thể chuyển cả hai số của bạn dưới dạng số nguyên khi bắt đầu.

Ngay cả sau khi làm điều đó, tôi nghi ngờ bạn sẽ có thể nhận được đến 10^6 chữ số. Bạn có thể cần phải thực hiện thuật toán phân chia của riêng bạn để có được ra cấp đó như bất kỳ thực hiện lành mạnh của toán học chính xác tùy ý sẽ dừng lại lâu trước thời điểm đó (ít nhất là theo mặc định).

+1

Tôi khá chắc chắn ' BigDecimal' có nhiều tiền ision như bạn muốn nó có (bạn chỉ có thể chờ lâu hơn một chút nếu bạn muốn chính xác hơn, bạn có thể chỉ định 'scale' một cách thích hợp trong' divide'). – Dukeling

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