在VB.Net中比较单个到双精度

Gle*_*nnC 2 vb.net

这是我的测试代码:

Dim testSingle As Single = 7.2
Dim testSingleF As Single = 7.2F
Dim testDouble As Double = 7.2

If testSingle = testDouble Then ' this is false
    Label1.Text = "true"
Else
    Label1.Text = "false"
End If

If testSingleF = testDouble Then ' this is false
    Label2.Text = "true"
Else
    Label2.Text = "false"
End If

If testSingle = 7.2F Then ' this is true
    Label3.Text = "true"
Else
    Label3.Text = "false"
End If
Run Code Online (Sandbox Code Playgroud)

正如您在我的评论中所看到的,前两个陈述是错误的,第三个是真的.这是为什么?精度应该无关紧要,因为它的数量很少.

这里发生了什么?

Hei*_*nzi 6

是的,精确度很重要,即使数量很少.为什么?因为7.2具有二进制表示法的无限位数:7.2(dec)= 111.001100110011...(bin) - 就像10/3 = 3.333 ...十进制表示法.

因此,SingleDouble是错误的选择,如果你需要精确地表示非整数.您有以下选择:

  • 使用Double,但永远不要比较绝对平等的数字a = b.相反,检查是否Abs(a-b)小于某个小阈值.
  • 使用Decimal专门为此目的创建的数据类型.简而言之,它存储72(可以用二进制表示),加上小数点右边有一位数的信息.因此,这里不会出现这些问题(至少不能用十进制表示法准确表示的数字.10/3仍然是一个问题......)

例如,可以在维基百科上找到更多信息.