关于VB日期时间计算误差的分析

2010-01-18 10:04叶喜民
关键词:数据类型程序设计运算

叶喜民,余 超

(新乡学院计算机与信息工程学院,河南新乡453003)

1 引 言

在程序中,常常使用变量来临时存储数据.对于变量,在程序执行的每个瞬间,变量的值都是确定的、已知的,但在程序执行的整个过程中它的值是可以发生变化的.在VB中,允许使用没有声明的变量,也可以使用通过Public、Private、Dim、Static等关键字声明的变量.由于其涉及的关键字比较多,使用的场合和位置也各不相同,所以其可以被访问的范围也不一样.在面向对象的Visual Basic程序设计过程中,变量有不同的作用域和生存期[1].

2 日期时间比较中存在的问题

Visual Basic中有系统定义的基本数据类型,也允许用户根据需要自定义数据类型.过程调用中的信息交换主要通过参数传递来实现,在VB中,时间日期型数据用“#”括起来放置日期和时间,允许用各种表示日期和时间的格式[2].

在VB程序设计的过程中,经过多次实验研究,发现VB在对时间日期进行差量计算、比较时存在着误差.下面先看两段对比程序 (见下页):

通过运行调试,对比两段程序的输出结果,发现当时间改变时,程序的输出结果也不相同,仅在程序2中输出了预期的“ok”.进一步进行测试,发现在一天的24个时间段数据中,只有在2,5,8,11几个时间点,程序输出结果为计划输出的“ok”,其他时间段数据都不能输出“ok”.

对于这个问题,查阅了很多资料和文献都没能找到对此问题的相关阐述,后自己通过程序调试、分析,采用将日期时间的原始值(内存中的存储值)引用出来与程序运行值对比的方法进行研究,发现在不同时间点程序输出结果出现误差的根本原因在于VB中对于日期时间数据的存储上,具体来说,就是在VB程序中,日期变量存储形式为IEEE 64位 (8字节)浮点形式,在这种形式中,数字表达的日期范围从0100年1月1日至9999年12月31日,时间范围从0:00:00到23:59:59.在这种存储形式中,当一个数字的值转换为日期类型时,小数部分表示时间,整数部分表示日期,其中日期,也就是整数部分一个单位为一天,时间部分就比较不容易确定了,例如0.0表示是午夜0点,0.5则表示是中午12点,在这种表示方法中,表示的精度由小数位数决定.

但我们知道,在计算机中,浮点数在进行计算的时候,最后几位是不精确的,通常在很多程序设计的时候,浮点数参与比较运算是要做特别处理,有时为了运算需要,也采取将最后几位舍掉的做法,在上述的两段对比程序中,两组不同时间点数据的输出结果不一致的原因也是在此.

要证明这个问题,可以在程序调试、运行后,将日期时间变量的原始值复制出来,也就是使用Win32API函数调用memory copy函数,把日期变量引用传递过去,具体说,就是对日期变量开始的8个字节的内存区进行复制,从而将日期变量的原始值复制出来进行计算、对比.

为了验证上述观点的正确性,我使用时间2010年5月20日8:20:10 AM为例进行测试运算,通过以下程序:

Private Declare Sub CopyMemory Lib"kernel32"Alias"Rtl MoveMemory"(ByVal Destination As Long,ByVal Source As Long,ByVal Length As Long)

Option Explicit

Sub main()

Dim myDate As Date

Dim myDouble As Double

Dim myarr(7)As Byte

Dim hexstr As String

Dim i As Integer

myDate=#5/20/2010 8:20:10 AM#

For i=0 To 7

hexstr=hexstr&Hex(myarr(i))&","

Next

MsgBox hexstr

End Sub

可以得到此时间点变量在内存中存储的原始值为f3 80 64 1d cb af e3 40,用此原始值进行dateAdd("s",-30,d)运算后,调用memory copy函数将运算结果的原始值复制出来为70 53 8c 1a cb af e3 40,此结果与VB直接计算得出的“2010/5/20 8:19:40”的原始值70 53 8c 1a cb af e3 40一致,因此输出了预期结果“ok”,从而证明在上述两段程序中VB对日期时间进行差量计算或比较时误差产生的原因就是在于使用浮点形式的数据存储形式.

3 结束语

数据在程序中以常量或变量的方式被引用,不同的数据特点有不同的存储要求和处理算法[3,4].在Visual Basic程序执行期间,变量在用不同的数据类型时,有可能对程序的的运行结果产生误差.

[1] 蒋文豪.Visual Basic在数据库中的应用 [J].电脑知识与技术,2007,(02):933-934

[2] 施奈德著,张长富译.Visual Basic 2008程序设计 (第7版)[M].北京:清华大学出版社,2009:113-121

[3] 刘模群.Visual Basic中参数传递的分析 [J].福建电脑,2009,(01):175

[4] 袁亚丽.浅谈API函数在VB开发中的应用 [J].河北北方学院学报:自然科学版,2007,(05):47-49

猜你喜欢
数据类型程序设计运算
重视运算与推理,解决数列求和题
详谈Java中的基本数据类型与引用数据类型
基于Visual Studio Code的C语言程序设计实践教学探索
有趣的运算
如何理解数据结构中的抽象数据类型
从细节入手,谈PLC程序设计技巧
“整式的乘法与因式分解”知识归纳
基于SeisBase模型的地震勘探成果数据管理系统设计
高职高专院校C语言程序设计教学改革探索
PLC梯形图程序设计技巧及应用