2012-06-18 22 views
5

Hiện đang học C++ và điều này đã xảy ra với tôi. Tôi chỉ tò mò về điều này khi tôi chuẩn bị phát triển một chương trình ngân hàng đơn giản. Tôi sẽ sử dụng double để tính toán đô la/lãi suất vv, nhưng có một số khác biệt nhỏ giữa tính toán máy tính và tính toán của con người.Nếu float và double không chính xác, làm thế nào để các ngân hàng thực hiện các phép tính chính xác liên quan đến tiền?

Tôi tưởng tượng rằng những cộng thêm .pennies trong thế giới thực có thể tạo nên sự khác biệt!

+3

kiểm tra http://stackoverflow.com/questions/149033/best-way-to-store-currency-values-in-c –

+0

Cảm ơn rất nhiều thông tin trên trang đó! –

+0

Xem thêm http://introcs.cs.princeton.edu/java/91float/, mô tả chi tiết vấn đề này cho sinh viên CS. – jvriesem

Trả lời

12

Trong nhiều trường hợp, tính toán tài chính được thực hiện bằng cách sử dụng số học điểm cố định thay vì dấu phẩy động.

Ví dụ: loại .NET Decimal hoặc loại VB6 Currency. Đây là cơ bản chỉ là các loại số nguyên, nơi mọi người đã đồng ý rằng các đơn vị là một phần nhỏ của một xu, như $ 0,0001.

Và có, một số làm tròn phải xảy ra, nhưng nó được thực hiện rất có hệ thống. Thông thường các quy tắc làm tròn ở đâu đó sâu trong bản in đẹp của hợp đồng của bạn (lãi suất là x%, gộp mỗi T, được làm tròn lên đồng xu gần nhất, nhưng không ít hơn $ y mỗi kỳ tuyên bố).

+0

Tôi đồng ý, các tính toán rất chính xác cho các điều phối trò chơi thường được thực hiện với các phép tính số nguyên. Các tính toán dấu chấm động luôn có một số lỗi làm tròn. –

+0

Không nghĩ về nó theo cách đó, cổ vũ. Tôi đang xem xét số học điểm cố định. Một ý nghĩ khác xảy ra là liệu các ngân hàng có sử dụng làm tròn lợi ích của họ hay không và nếu nó tạo ra số lượng lớn lợi nhuận (với số lượng lớn các giao dịch xảy ra mọi lúc). –

+2

@Kurzon: các giao dịch "thông thường" không có bất kỳ lỗi làm tròn nào, vì khi tôi chuyển '$ 1.23' cho bạn, số dư của tôi giảm xuống chính xác là' 123c' và số tiền của bạn tăng lên một cách chính xác '123c': quan tâm no. Nó áp dụng cho những thứ như lãi suất và tiền hoa hồng, nơi bạn nhân một số tiền bằng một số tỷ lệ phần trăm có thể có rất nhiều chữ số thập phân. Nhưng giống như Ben nói rằng các quy tắc được xác định bởi một hợp đồng hoặc pháp luật ở đâu đó. Nếu bạn là một nhà giao dịch chênh lệch vận tốc cao, có thể bạn quan tâm đến các quy tắc làm tròn. Các khách hàng khác có lẽ không quá nhiều. –

0

Chỉ vì một số không phải là số nguyên không có nghĩa là nó không thể được tính toán chính xác. Hãy xem xét rằng một giá trị đô la và một xu là một số nguyên nếu một số đếm số xu (cent), do đó, nó là một vấn đề đơn giản cho một thư viện điểm cố định bằng cách sử dụng hai thập phân chính xác để nhân lên từng số bằng 100, thực hiện tính như một số nguyên, và sau đó chia cho 100 một lần nữa.

1

Phạm vi của 8 byte dài là: -9223372036854775808 max: 9223372036854775807 làm mọi thứ với hàng nghìn xu/xu và bạn vẫn có thể xử lý số lên đến hàng nghìn tỷ đô la/pound/bất kỳ thứ gì.

1

Tùy thuộc vào ứng dụng. Tất cả các tính toán với số thập phân sẽ là số yêu cầu làm tròn khi bạn xuất chúng dưới dạng đô la và xu (hoặc bất kỳ số tiền nội tệ là ): giá cơ sở của một bài viết chỉ có thể có hai số sau chữ số thập phân, nhưng khi bạn thêm thuế bán hàng hoặc VAT, có sẽ nhiều hơn và nếu bạn cần tính lãi cho khoản đầu tư, sẽ có nhiều hơn.

Nói chung, sử dụng double kết quả trong các kết quả chính xác nhất, tuy nhiên ... nếu phần mềm của bạn đang được sử dụng cho một số loại kế toán theo yêu cầu của pháp luật (ví dụ như cho mục đích tính thuế), bạn có thể phải làm theo tiêu chuẩn thực hành làm tròn được chấp nhận và chúng được dựa trên số thập phân số học, không phải nhị phân, thập lục phân hoặc bát phân (là các cơ sở thông thường cho dấu phẩy động — nhị phân là phổ quát trên mọi thứ trừ khung chính). Trong những trường hợp như vậy, bạn sẽ cần phải sử dụng một số loại lớp học Decimal , đảm bảo làm tròn chính xác. Đối với các mục đích sử dụng khác (ví dụ: rủi ro phân tích), double là tốt.

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