如何处理 vb.net 中双精度数的舍入错误?

Posted

技术标签:

【中文标题】如何处理 vb.net 中双精度数的舍入错误?【英文标题】:How do I cope with rounding errors on doubles in vb.net? 【发布时间】:2010-09-16 05:55:42 【问题描述】:

我正在尝试使用 vb.net 平衡一组货币价值。这两个值的总和被转换为双精度值。在某些情况下,我会遇到舍入错误。

避免这种情况的最佳方法是什么?有没有一种我可以优先使用的类型?如何将结果值四舍五入到小数点后两位?

这是我的代码 - 我可能不需要展示它,但以防万一。

  Dim nInvValue As Double
  Dim nCreditValue As Double

  For Each oReferenceItem In oMatchInvoices
     Dim nUnallocated As Double = oReferenceItem.DocumentOutstandingValue - oReferenceItem.DocumentAllocatedValue
     If ((nUnallocated <> 0) And (sReferenceValue = oReferenceItem.InstrumentNo)) Then
        iCount = iCount + 1
        If (oReferenceItem.IsDebit) And (nUnallocated > 0) Then
           nInvValue = nInvValue + nUnallocated
           InvoiceList.Add(nUnallocated.ToString("c"), oReferenceItem.URN.ToString)
        End If
        If (oReferenceItem.IsCredit) And (nUnallocated < 0) Then
           nCreditValue = nCreditValue - nUnallocated
           CreditList.Add(nUnallocated.ToString("c"), oReferenceItem.URN.ToString)
        End If
     End If
  Next

【问题讨论】:

【参考方案1】:

尝试使用 Decimal 类型。

MSDN - Decimal

【讨论】:

【参考方案2】:

对于财务计算,我认为目前的智慧是使用小数而不是双精度数。

您可能对此讨论感兴趣Decimal Vs. Double。

【讨论】:

以上是关于如何处理 vb.net 中双精度数的舍入错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 floor 函数的舍入错误

java中的舍入双[重复]

std::cbrt 的舍入错误?

898A. Rounding#数的舍入

c集成程序中的舍入错误

VB.NET 表单变量是如何处理的