| 网站首页 | 新闻 | 新书 | 专家 | 技巧 | 源码作品 | 工具/资源 | 商城 | 风采 | 留言 | 论坛 | 网址 | 承接 | 
您现在的位置: Access/Office中国 >> 技巧 >> Access >> 模块类函数VBA >> 文章正文 用户登录 新用户注册
新手来看:为什么数字计算结果总是错误?变量类型声明的重要性           ★★★
新手来看:为什么数字计算结果总是错误?变量类型声明的重要性
作者:cg1 文章来源:access911.net 点击数: 本日:{$DayHits} 更新时间:2008-11-26 9:20:32

问题:

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

请将下列代码复制到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    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)