2010-04-08 37 views
9

Vâng, sự cai trị "Đối với tiền, luôn luôn thập phân" không được áp dụng bên trong đội ngũ phát triển của Microsoft, bởi vì nếu nó là:"Đối với tiền, luôn luôn thập phân"?

Namespace: Microsoft.VisualBasic 
Assembly: Microsoft.VisualBasic (in Microsoft.VisualBasic.dll) 

Financial.IPmt và tất cả các phương pháp khác sẽ nhận/trả decimal và không double.

Bây giờ tôi tự hỏi liệu tôi có thể sử dụng các phương pháp này mà không phải lo lắng về những sai lầm tròn?

Tôi có nên sử dụng một số thư viện khác để làm việc với tài chính không? Nếu có, bạn có thể chỉ cho tôi một số thông tin tốt (để sử dụng số C#) không?

+1

đoán hoàn toàn-không-một-VB-user của tôi sẽ là thư viện tài chính có thể xử lý lưu trữ một cách chính xác trong nội bộ, nhưng tôi sẽ không đặt cược vào nó. Bạn sẽ muốn kiểm tra xem xử lý nội bộ là phù hợp hay không trước khi chỉ lên án nó trên cơ sở loại trả về. – Matchu

+18

Phiếu bầu của tôi là dành cho boolean - bạn có tiền hoặc bạn không ;-) – scunliffe

+1

Cũng giống như vậy đối với VB và C# – Dryadwoods

Trả lời

3

Bạn có thể sử dụng lớp này:

public class Financial 
{ 
    #region Methods 

    public static decimal IPmt(decimal Rate, decimal Per, decimal NPer, decimal PV, decimal FV, FinancialEnumDueDate Due) 
    { 
     decimal num; 
     if (Due != FinancialEnumDueDate.EndOfPeriod) 
     { 
      num = 2; 
     } 
     else 
     { 
      num = 1; 
     } 
     if ((Per <= 0) || (Per >= (NPer + 1))) 
     { 
      //Argument_InvalidValue1= 

      throw new ArgumentException("Argument 'Per' is not a valid value."); 
     } 
     if ((Due != FinancialEnumDueDate.EndOfPeriod) && (Per == 1)) 
     { 
      return 0; 
     } 
     decimal pmt = Pmt(Rate, NPer, PV, FV, Due); 
     if (Due != FinancialEnumDueDate.EndOfPeriod) 
     { 
      PV += pmt; 
     } 
     return (FV_Internal(Rate, Per - num, pmt, PV, FinancialEnumDueDate.EndOfPeriod) * Rate); 
    } 

    public static decimal PPmt(decimal Rate, decimal Per, decimal NPer, decimal PV, decimal FV, FinancialEnumDueDate Due) 
    { 
     if ((Per <= 0) || (Per >= (NPer + 1))) 
     { 
      throw new ArgumentException("Argument 'Per' is not valid."); 
     } 
     decimal num2 = Pmt(Rate, NPer, PV, FV, Due); 
     decimal num = IPmt(Rate, Per, NPer, PV, FV, Due); 
     return (num2 - num); 
    } 

    static decimal FV_Internal(decimal Rate, decimal NPer, decimal Pmt, decimal PV, FinancialEnumDueDate Due) 
    { 
     decimal num; 
     if (Rate == 0) 
     { 
      return (-PV - (Pmt * NPer)); 
     } 
     if (Due != FinancialEnumDueDate.EndOfPeriod) 
     { 
      num = 1 + Rate; 
     } 
     else 
     { 
      num = 1; 
     } 
     decimal x = 1 + Rate; 
     decimal num2 = (decimal)Math.Pow((double)x, (double)NPer); 
     return ((-PV * num2) - (((Pmt/Rate) * num) * (num2 - 1))); 
    } 

    static decimal Pmt(decimal Rate, decimal NPer, decimal PV, decimal FV, FinancialEnumDueDate Due) 
    { 
     decimal num; 
     if (NPer == 0) 
     { 
      throw new ArgumentException("Argument NPer is not a valid value."); 
     } 
     if (Rate == 0) 
     { 
      return ((-FV - PV)/NPer); 
     } 
     if (Due != FinancialEnumDueDate.EndOfPeriod) 
     { 
      num = 1 + Rate; 
     } 
     else 
     { 
      num = 1; 
     } 
     decimal x = Rate + 1; 
     decimal num2 = (decimal)Math.Pow((double)x, (double)NPer); 
     return (((-FV - (PV * num2))/(num * (num2 - 1))) * Rate); 
    } 

    #endregion Methods 
} 
+0

Xin chào, Biến Per là gì? – cbp

+0

@cbp Vui lòng xem hàm VB cho [PPmt] (https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.financial.ppmt.aspx), khớp với hàm 'PPmt' ở đây (thứ 2 function), gọi là 'IPmt'. –

10

Dưới đây là một cuộc thảo luận thú vị về chính xác những chủ đề này: http://www.vbforums.com/showthread.php?t=524101

Về 1/3 đường đi xuống một ai đó giải thích rằng nó sử dụng kép vì các chức năng VB.NET đã được thực hiện để làm việc chính xác giống như VB6. VB6 không có kiểu thập phân, đó là lý do tại sao nó sử dụng gấp đôi.

Vì vậy, có vẻ như nếu độ chính xác là quan trọng, bạn không được sử dụng sử dụng các chức năng này.

Câu trả lời cho this question có một số giải pháp thay thế đầy hứa hẹn - chỉ cần bỏ qua câu trả lời được chấp nhận đề xuất sử dụng thư viện VB.

Câu hỏi liên quan trước đây đã bị xóa, vì vậy đây là một số những gợi ý tôi đã tham khảo (lưu ý: Tôi đã không cố gắng này, YMMV)

+0

VB6 không có loại Tiền tệ, là một Int64 với bốn chữ số thập phân ngụ ý. –

+0

Tôi quyết định viết các phương thức tài chính của riêng mình với các giá trị thập phân. Phản xạ.Net của Cổng đỏ là một công cụ hữu ích: D – Dryadwoods

8

Nguyên tắc sử dụng decimal với tiền bỏ ra là hữu ích bởi vì hầu hết các đồng tiền có đơn vị thập phân. Bằng cách sử dụng số học thập phân, bạn tránh giới thiệu và tích lũy lỗi vòng.

Financial Class functions sử dụng dấu chấm động trong một vài lý do:

  • Họ không nội tích lũy - chúng được dựa trên một hình thức đóng mũ/tính toán logarit, không lặp lại và tổng kết trong thời gian.
  • Chúng có xu hướng không sử dụng hoặc tạo ra các giá trị thập phân chính xác. Ví dụ: tỷ lệ lãi suất hàng năm thập phân chính xác chia cho 12 khoản thanh toán hàng tháng sẽ trở thành một số thập phân lặp lại.
  • Chúng được thiết kế chủ yếu để hỗ trợ quyết định và cuối cùng có rất ít khả năng áp dụng cho sổ sách kế toán thực tế.

Pmt và làm tròn có thể quyết định việc thanh toán hàng tháng không đáng kể, nhưng một khi số tiền đó được xác định, tích lũy cân bằng - các khoản thanh toán, chi phí lãi vay áp dụng, vv - xảy ra trong decimal. Ngoài ra, các khoản thanh toán trễ hoặc tạm ứng, ngày thanh toán và các khoản không thống nhất khác sẽ làm mất hiệu lực khấu hao dự kiến ​​do các chức năng tài chính cung cấp.

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