2011-11-21 49 views

Trả lời

-8

Bạn không bao giờ nên sử dụng loại thập phân cho tiền tệ. Sử dụng một loại số nguyên. Điều này duy trì độ chính xác mua tránh lỗi làm tròn liên quan đến phao nổi

Khi hiển thị một lượng sau đó chia cho hệ số thích hợp để lấy phần không tách rời.

+7

Thực ra, BigDecimals hoàn toàn an toàn và chính xác nếu được sử dụng đúng cách. Chỉ cần không sử dụng 'double' hoặc' float'. –

+1

+1: @aaamos ngoại trừ hầu hết các ngân hàng đầu tư sử dụng 'double', đôi khi int/long. đặc biệt là những người sử dụng C/C++, nó không có kiểu thập phân. –

+1

@Peter: một gợi ý khác là họ không thực sự biết họ đang làm gì. Có rất nhiều thư viện tiền tệ/điểm cố định cho C++ và thật dễ dàng để viết một bản thân. –

9

Thông thường bạn muốn sử dụng "một nửa lên" làm tròn, như vậy:

myBigDecimal.setScale(2, RoundingMode.HALF_UP); 

Bằng cách này, bạn sẽ tròn đến hai chữ số thập phân (mà hầu hết các đồng tiền sử dụng, ví dụ như đô la và cent, rõ ràng là có ngoại lệ), và bạn sẽ làm tròn các giá trị như vậy mà một nửa hoặc nhiều hơn sẽ tròn lên trong khi ít hơn một nửa xu sẽ tròn xuống. Xem the javadoc để biết thêm chi tiết.

42

Không có chế độ "đúng", tùy thuộc vào trường hợp doanh nghiệp. Ví dụ:

  • Khi tính thuế hàng năm, các phân số thường bị cắt (RoundingMode.FLOOR).
  • Khi tính tiền thưởng, bạn có thể muốn luôn làm tròn lợi cho khách hàng (RoundingMode.CEILING).
  • Đối với các loại thuế trên hóa đơn, bạn thường làm tròn HALF_UP
  • Khi thực hiện mô phỏng tài chính phức tạp, bạn không muốn làm tròn.

documentation of RoundingMode chứa rất nhiều ví dụ về cách hoạt động của các chế độ khác nhau.

Để có câu trả lời hay hơn, bạn phải cho chúng tôi biết bạn muốn đạt được điều gì.

Điều đó nói rằng, BigDecimal là loại chính xác để sử dụng trong Java vì nó có thể giữ lại bất kỳ số lượng chính xác nào và cho phép bạn chọn chế độ làm tròn phù hợp nhất cho trường hợp của bạn.

15

Phần lớn thời gian BigDecimal là lựa chọn hợp lệ duy nhất cho loại tiền tệ. Nhưng sự lựa chọn của chiến lược làm tròn không phải là điều hiển nhiên.

Giá trị mặc định là HALF_EVEN, đây sẽ là lựa chọn tốt. Thuật toán này được gọi là làm tròn số ngân hàng (xem thảo luận here).

Một chiến lược chung khác là HALF_UP trực quan hơn nhưng có đặc điểm thống kê hơi kém hơn.

Cũng lưu ý rằng trong nhiều lần (đặc biệt là trong ngân hàng và bảo hiểm), chiến lược làm tròn sẽ được quyết định bởi các yêu cầu nghiệp vụ, thường khác nhau đối với các trường hợp sử dụng khác nhau.

+0

Bạn nên thêm rằng HALF_EVEN không hiệu quả. – Jus12

4

Đối với các ứng dụng tài chính ROUND_HALF_EVEN là chế độ làm tròn thông thường nhất. Chế độ đó tránh được sự sai lệch. Nhưng để hiển thị, bạn nên sử dụng lớp NumberFormat. Lớp học này sẽ chăm sóc các vấn đề bản địa hóa đối với số tiền bằng các loại tiền tệ khác nhau.Nhưng NumberFormat chỉ chấp nhận nguyên thủy. Vì vậy, hãy sử dụng cái cuối cùng nếu bạn có thể chấp nhận thay đổi độ chính xác nhỏ trong các phép biến đổi thành gấp đôi.

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