代码之家  ›  专栏  ›  技术社区  ›  WiseGuyEh

系统。分配小数点

  •  1
  • WiseGuyEh  · 技术社区  · 16 年前

    有人能解释为什么我得到以下结果吗?

    Dim badDecimal As Decimal = 54.50327999999999 
    Dim expectedDecimal As Decimal = CDec("54.50327999999999")
    

    提前感谢您的帮助。

    1 回复  |  直到 16 年前
        1
  •  6
  •   Lasse V. Karlsen    16 年前

    根据本页: Decimal Data Type (Visual Basic) D ,否则编译器将尝试将其编译为适当但不同的数字类型,如 Integer , Long Double 等,取决于所使用的常量值。

    在您的例子中,代码在编译器看来基本上是这样的:

    Dim badDecimal As Decimal = (constant of type System.Double)
    

    因此,在编译时,常量值已经失去了精度。

    只需将代码更改为:

    Dim badDecimal As Decimal = 54.50327999999999D
                                                 ^
                                                 +-- add this
    

    它应该像预期的那样工作。

    然而,我已经厌倦了期望这两个变量的比较是相同的,有足够的问题 StackOverflow 关于浮点类型的“问题”,至少让我告诉你,第n个小数点可能有微小的差异,小到不能显示或调试器,但足以使两个变量比较不同。

    例如:

    If Math.Abs(badDecimal - expectedDecimal) < 0.000001 Then
    

    If badDecimal = expectedDecimal Then
    
    推荐文章