会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > 模块函数VBA > 正文

新手来看:为什么数字计算结果总是错误?变量类型声明的重要性

时间:2008-11-26 09:20 来源:access911.net 作者:cg1 阅读:

问题:

论坛发帖 请求处理 很多版主都无法解释的现实问题

请将下列代码复制到VBE编辑器中,运行SUB过程,计算结果(9.58)与手工计算结果(9.59)有误差。

我用这个自定义函数计算个人所得税一两年了,公司有几百名员工。从来没出现过计算错误,但本月出现这个误差让我觉得很费解,目前只发现在计算这一组数字的时候会出问题。

Function gs(t)
d = t - 1600
If d < 0 Then
gs1 = 0
ElseIf d <= 500 Then
gs1 = d * 0.05
ElseIf d <= 2000 Then
gs1 = d * 0.1 - 25
ElseIf d <= 5000 Then
gs1 = d * 0.15 - 125
ElseIf d <= 20000 Then
gs1 = d * 0.2 - 375
ElseIf d <= 40000 Then
gs1 = d * 0.25 - 1375
ElseIf d <= 60000 Then
gs1 = d * 0.3 - 3375
End If
Debug.Print gs1 '(经测试在计算本例时,gs1= 9.58499999999999)
gs = VBA.Round(gs1, 2)
End Function


Sub dd()
t = 2091.7
tt = 300
ttt = gs(t - tt)
MsgBox ttt  'ttt为什么是9.58 手工计算的结果是9.59
End Sub


注意,这里不是说ROUND函数的问题,在被 ROUND 函数处理前,变量 gs1 的结果就已经错误了

 


回答:


本文目的是提醒大家正确声明 VBA 变量的数据类型

该代码示例连基本的数据类型都没声明

Function gs(t As Currency)
Dim d As Currency

d = t - 1600
If d < 0 Then
gs1 = 0
ElseIf d <= 500 Then
gs1 = d * 0.05
ElseIf d <= 2000 Then
gs1 = d * 0.1 - 25
ElseIf d <= 5000 Then
gs1 = d * 0.15 - 125
ElseIf d <= 20000 Then
gs1 = d * 0.2 - 375
ElseIf d <= 40000 Then
gs1 = d * 0.25 - 1375
ElseIf d <= 60000 Then
gs1 = d * 0.3 - 3375
End If
Debug.Print gs1 '(经测试在计算本例时,gs1= 9.585)
gs = VBA.Round(gs1, 2)
End Function

 


Sub dd()
Dim t As Currency
Dim tt As Currency
t = 2091.7
tt = 300
ttt = gs(t - tt)
Debug.Print ttt  'ttt是9.59
End Sub


结果是 9.585
四舍五入应该是 9.59


不用ROUND代码还是有问题是因为变量类型没声明
你不声明变量默认用 Variant 类型

Function TestVariant()
    Dim v
    v = 555.5545
    Debug.Print TypeName(v)        'Double
End Function

Variant 类型的数字如果包含小数点默认是双精度,看一下帮助双精度的表示方法是 e 的多少次方。e根本不是整数,所以计算多次后必定有 .????9999999 出现,导致数据结果错误。

(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: