2010-01-21 47 views
17

tôi đã không tìm thấy bất kỳ phương pháp tự nhiên để làm được điều này, vì vậy tôi tạo của riêng tôi trong một lớp helper:Tính tỷ lệ phần trăm cho BigDecimals

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){ 
    return base.multiply(pct).divide(new BigDecimal(100)); 
} 

Nhưng tôi không hoàn toàn giống như nó, tôi tự hỏi, nếu API có một cái gì đó tương tự. Lớp Số (tổ tiên của BigDecimal) sẽ là một nơi tốt đẹp.

+5

Tại sao bạn không thích nó? Có gì sai với nó? –

+2

Tôi nghĩ về việc có bao nhiêu lập trình viên khác sẽ tạo ra cùng một phương pháp, nó chỉ là DRY. Ngay cả máy tính đơn giản nhất cũng có một nút phần trăm. Tôi không thể hiểu tại sao lớp học lại không có nó. –

+1

@LluisMartinez: Vấn đề ở đây là chính xác. Khi bạn chia hai '' BigDecimal' '(mà bạn làm khi tính tỷ lệ phần trăm), bạn phải cung cấp một chế độ làm tròn thích hợp. Tôi cho rằng đó là lý do tại sao lớp không cung cấp phương thức '' percent() ''. Chỉ cần nhìn vào '' BigDecimal'', có sáu phương thức '' divide() '' đã có các chữ ký khác nhau. Cung cấp một phương pháp phần trăm, bạn sẽ phải thêm một phương pháp khác 6+ và cuối cùng sẽ làm nổi bật toàn bộ quá trình triển khai. – user1438038

Trả lời

7

Vui lòng phân lớp BigDecimal và thêm phương thức đó. Ngoài ra, bạn mong đợi điều gì? Bạn biết nơi để tìm các API và xác nhận rằng lớp bạn muốn có phương pháp đó không. Cá nhân, tôi muốn nói rằng chức năng này là tầm thường đến nỗi sẽ không có nhiều điểm trong việc có nó trong API chuẩn.

+4

Có tầm thường nhưng được sử dụng rất thường xuyên, ít nhất là trong một số loại ứng dụng nhất định. –

+1

Tôi đồng ý. Mặc dù tầm thường, nhưng được sử dụng rất nhiều – vsingh

11

Tôi không nghĩ có API cho điều đó (không thực sự cần thiết).
giải pháp của bạn vỉa tốt với tôi, có thể bạn chỉ cần thêm hằng ONE_HUNDRED:

public static final BigDecimal ONE_HUNDRED = new BigDecimal(100); 

public static BigDecimal percentage(BigDecimal base, BigDecimal pct){ 
    return base.multiply(pct).divide(ONE_HUNDRED); 
} 

lẽ không có nhiều lợi ích, chỉ khi gọi rất thường

cuối cùng đặt nó trong một số lớp util ...

+1

BigDecimal có ZERO, ONE và TEN. Nhưng không phải HUNDRED hoặc THOUSAND. Curioso! –

+0

@Lluis: 'ZERO' và' ONE' khá cũ (Java 1.2); 'TEN' cũng đã cũ, kể từ Java 5; có lẽ chúng tôi nhận được HUNDERT với Java 7 :-) nhưng không phải là một việc lớn để tạo ra nó anyway ... Saludos! –

2

Xem thêm DecimalFormat. Bạn có thể sử dụng phương pháp nhà máy của cha mẹ NumberFormat.getPercentInstance() như được hiển thị here, hereet al.

+2

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/17666153) –

5

Bạn có thể muốn thực hiện phép chia cho 100 bằng cách sử dụng BigDecimal.scaleByPowerOfTen(-2).

Nó tăng thêm nếu bạn làm điều đó hàng triệu lần. Trải nghiệm của tôi nhanh hơn nhiều.

Ngoài ra còn có phương pháp tương tự BigDecimal.movePointLeft(2) - xem the other thread để biết chi tiết và quyết định cái nào hoạt động tốt hơn cho bạn.

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