新手来看:为什么数字计算结果总是错误?变量类型声明的重要性
时间: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)