2012-04-06 42 views
44

Trong Java, tôi đang làm việc với lớp BigDecimal và một phần mã của tôi yêu cầu tôi trích xuất phần phân đoạn từ nó. BigDecimal dường như không có bất kỳ phương thức tích hợp nào để giúp tôi lấy số sau dấu thập phân của BigDecimal.Java, chỉ trích xuất phần phân đoạn của BigDecimal?

Ví dụ:

BigDecimal bd = new BigDecimal("23452.4523434"); 

tôi muốn trích xuất các 4523434 từ số đại diện ở trên. Cách tốt nhất để làm điều đó là gì?

Trả lời

67

Tôi sẽ thử bd.remainder(BigDecimal.ONE).

Sử dụng phương pháp remainder và hằng số ONE.

BigDecimal bd = new BigDecimal("23452.4523434"); 
BigDecimal fractionalPart = bd.remainder(BigDecimal.ONE); // Result: 0.4523434 
+10

@Franklin - vui lòng không chấp nhận câu trả lời của tôi và thay vào đó chấp nhận câu trả lời của Taymon vì nó sạch hơn và tổng thể tốt hơn tôi. 1+ đến Taymon. –

+6

Mã của giải pháp hiện tại sẽ trả về "0,4523434", chứ không phải "4523434" như tác giả muốn. Một số động thái khác sẽ được yêu cầu. –

+1

quan trọng của nó để chỉ nhận được "4523434" trong một số trường hợp, câu trả lời này không trả lại kết quả chính xác, nên in đầu ra là tốt. –

7

Dưới đây là một thay thế cho việc sử dụng remainder() phương pháp:

BigDecimal bd = new BigDecimal("23452.4523434"); 
BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())); 

Hơn nữa, bạn có thể thử phương pháp abs() để đảm bảo phần phần là tích cực:

BigDecimal fracBd = bd.subtract(new BigDecimal(bd.toBigInteger())).abs(); 
+0

Tốt hơn nhiều so với mã phương thức "còn lại" phức tạp – marcolopes

+0

Trừ mà không có ngữ cảnh toán học có thể dẫn đến một số kết quả thú vị. – Ishmael

+0

Không trích xuất chỉ "4523434", đây không phải là câu trả lời đúng –

5

Nếu giá trị âm, sử dụng bd.subtract() sẽ trả về một số thập phân sai.

Sử dụng này:

BigInteger decimal = 
       bd.remainder(BigDecimal.ONE).movePointRight(bd.scale()).abs().toBigInteger(); 

Nó trả 4523434 cho 23452.4523434 hoặc -23452.4523434


Bên cạnh đó, nếu bạn không muốn số không thêm vào bên phải phần thập phân, sử dụng :

bd = bd.stripTrailingZeros(); 

trước mã trước.

+0

Trong khi mã của bạn chính xác chính xác, nó không có trong thực tế. Hãy tưởng tượng đầu vào là 'BigDecimal (" 123.45 "). SetScale (6)' sau đó bạn sẽ nhận được '450000'. Khó có kết quả hữu ích. –

+0

@PavelVlasov số đó vẫn sẽ là một phần phân đoạn, đó là câu hỏi ban đầu. Mỗi số không ở bên phải của "phần phân số" là vô ích, do đó, '45' hoặc' 450000' là bình đẳng trong ngữ cảnh này. – IvanRF

+1

@PavelVlasov để giải quyết trường hợp của bạn, áp dụng 'bd = bd.stripTrailingZeros();' trước mã của tôi. – IvanRF

2

Trả lại "4523434" này, ngay cả khi bạn đặt số ở số âm "-23452.4523434".

BigDecimal d = BigDecimal.valueOf(23452.4523434); 
BigInteger decimal = d.remainder(BigDecimal.ONE).movePointRight(d.scale()).abs().toBigInteger(); 
Các vấn đề liên quan