很多人都知道在数据库中如果需要进行精确计算的字段,尽量不使用单精度和双精度这两种数据类型。因为它们属于浮点数,而浮点数采用二进制保存小数,并且进行浮点运算,这就意味着计算的结果准确性会比较差。如果一定需要小数,则可以使用货币(Currency)型和小数(Decimal)型,这两种是量化的整数数据类型,具有高度的正确性。
通过如下代码可以非常清楚的测试出浮点数的准确度不够:
Sub 数据类型对比测试()
Dim sngNum As Single
Dim dblNum As Double
Dim varNum As Variant '小数没有单独的类型,它属于Variant的子类型
Dim curNum As Currency
Dim lngI As Long
For lngI = 1 To 1000
sngNum = sngNum + 0.1
dblNum = dblNum + 0.1
varNum = varNum + CDec(0.1)
curNum = curNum + 0.1
Next
Debug.Print "单精度:" & sngNum
Debug.Print "双精度:" & dblNum
Debug.Print "小数: " & varNum
Debug.Print "货币: " & curNum
End Sub
根据我们的想象,最后的结果应该是1才对,而实际返回结果为:
单精度:99.99905
双精度:99.9999999999986
小数: 100
货币: 100
附 图: