Access交流网
  • 设为首页|收藏本站|繁体中文|手机版
  •     
  • Access培训-Access开发平台-Access行业开发

  • 首页
  • 资讯
  • 技巧
  • 源码
  • 行业
  • 资源
  • 活动
  • 关于

技巧

ACCESS数据库

启动/设置/选项/背景

修复/压缩

安全/加密/解密

快捷键

版本升级/其它等

数据表

命名方式/设计规范

表设计

查询

Sql语言基础

选择查询

更新查询

删除查询

追加查询

生成表查询

交叉表查询

SQL特定查询

查询参数

查询综合应用

界面/窗体/控件

标签

文本框

命令按钮

组合框/列表框

选项组/复选框/选项按钮

选项卡

子窗体

窗体本身/综合应用

其它

报表打印

报表设计

高级报表

模块/函数/VBA/API/系统

VBA基础

内置函数

调试/跟踪/Debug

模块/类模块

API/COM/系统相关

字符数字日期

网络通信游戏

加密解密安全

文件处理

经典算法

宏/菜单/工具栏/功能区

宏/脚本

菜单/工具栏

功能区/Ribbon

图表/图形/图像/多媒体

图表

图形/图像

音频

视频/动画

DAO/链接表/ADO/ADP

DAO/链接表/ODBC

ADO/RDO

ADP

ActiveX/第三方控件/插件

Treeview树控件

ListView列表控件

Toolbar工具栏控件

微软其它控件

Dbi-Tech

CodeJock

Grid++Report

FastReport

ComponentOne

加载项/插件/Addin

OFFICE集成/导入导出/交互

Excel导入导出/交互

Word导入导出/交互

PPT交互

Outlook控制/邮件

Text文本文件/INI/CSV

PDF/SWF/XML格式

CAD格式

Sharepoint/其它Office

SqlServer/其它数据库

表

视图

存储过程/触发器

函数

用户/权限/安全

调试/维护

SqlServer其它/综合

发布/打包/文档/帮助

开发版/运行时

打包/发布/部署

开发文档/帮助制作

Access完整行业系统

采购管理系统

销售管理系统

仓库管理系统

人力资源管理HRM

CRM管理系统

MRP/ERP管理系统

BRP/流程优化

其它管理系统

心得/经验/绝招
其它/杂项
Excel技巧

Excel应用与操作

Excel开发编程

Word技巧

Word应用与操作

Word开发编程

Outlook技巧

Outlook应用与操作

Outlook开发编程

热门文章

  • 动态引用 DLL 库
  • Access或VB VBA..
  • ACCESS-VBA编程 ..
  • Access限制文本框的输..
  • Access算出每个月的天..
  • 简洁的人民币大写转换函数

最新文章

  • Access或VB VBA..
  • 关于VBA的0、""(空字..
  • Access导出函数Out..
  • Access日期与日期区间..
  • RecordSource ..
  • Access子窗体事件控制..

联系方式

Access交流网(免费Access交流)

QQ:18449932 

网  址:www.access-cn.com

当前位置:首页 > 技巧 > 模块/函数/VBA/API/系统 > VBA基础
VBA基础

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

问题:

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

请将下列代码复制到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 出现,导致数据结果错误。

发布人:cg1-access911.net  
分享到:
点击次数:  更新时间:2008-11-26 09:20:32  【打印此页】  【关闭】
上一条:修改Access表结构  下一条:一个将数据导出到EXCEL的存储过程



相关文章

  • • Access或VB VBA判断数组的值是否为空的几种方法
  • • 关于VBA的0、""(空字符串)、Null、Empty、与 Nothing 的区别
  • • Access导出函数OutPutto解释
  • • Access日期与日期区间的筛选
  • • RecordSource SourceObject ControlSource属性的区别
  • • Access子窗体事件控制父窗体
  • • 事件​change和AfterUpdate的区别
  • • 代码修改完善方法示例(初学者必读)

热门文章

  • [2016-12-24] Access自动时钟及数字自增变色access数据库
  • [2017-05-16] 一句查询代码实现Excel数据导入导出access数据库
  • [2017-03-02] Access函数判断每月最后一个周五是几号access数据库
  • [2003-12-20] 键盘常用代码一览表access数据库
  • [2009-03-07] 17种正则表达式access数据库
  • [2017-05-24] Access 中IIF Switch Choose 3个函数的区别和使用方法access数据库

热门产品

公司动态|在线留言|在线反馈|友情链接|会员中心|站内搜索|网站地图

Access交流网 版权所有 1999-2018 粤ICP备10043721号

QQ:18449932

Access应用 Access培训 Access开发 Access平台

access|数据库|access下载|access教程|access视频|access软件

Powered by MetInfo 5.3.12 ©2008-2023  www.metinfo.cn