手头上正在做一套住房公积金管理软件,碰到了数据精度的问题,偶然发现下面的情况: 代码: Private Sub Command1_Click() Dim r1 As Single r1 = 0.1
Dim result As Double
result = 1 * r1 Debug.Print result End Sub
结果输出: .100000001490116 很显然,在计算的过程中,r1被从single转换成double类型后参与了计算,而转换的过程中出现了误差,为验证这一点,我修改了代码: Private Sub Command1_Click() Dim r1 As Single r1 = 0.1 Debug.Print CDbl(r1) End Sub 结果输出: .100000001490116 果然是这样,这个结果让我大出意外,因为我的软件中一部分计算就是把Single类型的利率和Double型的应缴额放在一起进行的,而出现偏差就在所难免了。
为什么会出现误差呢? MSDN中说:浮点(Single 和 Double)数比 Currency 的有效范围大得多,但有可能产生小的进位误差。
看来为了追求精度,最好把Double类型换成Currency类型,或者把Single类型换成与Double一致。 
|