国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

關于VB日期時間計算誤差的分析

2010-01-18 10:04葉喜民
關鍵詞:數(shù)據(jù)類型程序設計運算

葉喜民,余 超

(新鄉(xiāng)學院計算機與信息工程學院,河南新鄉(xiāng)453003)

1 引 言

在程序中,常常使用變量來臨時存儲數(shù)據(jù).對于變量,在程序執(zhí)行的每個瞬間,變量的值都是確定的、已知的,但在程序執(zhí)行的整個過程中它的值是可以發(fā)生變化的.在VB中,允許使用沒有聲明的變量,也可以使用通過Public、Private、Dim、Static等關鍵字聲明的變量.由于其涉及的關鍵字比較多,使用的場合和位置也各不相同,所以其可以被訪問的范圍也不一樣.在面向對象的Visual Basic程序設計過程中,變量有不同的作用域和生存期[1].

2 日期時間比較中存在的問題

Visual Basic中有系統(tǒng)定義的基本數(shù)據(jù)類型,也允許用戶根據(jù)需要自定義數(shù)據(jù)類型.過程調用中的信息交換主要通過參數(shù)傳遞來實現(xiàn),在VB中,時間日期型數(shù)據(jù)用“#”括起來放置日期和時間,允許用各種表示日期和時間的格式[2].

在VB程序設計的過程中,經(jīng)過多次實驗研究,發(fā)現(xiàn)VB在對時間日期進行差量計算、比較時存在著誤差.下面先看兩段對比程序 (見下頁):

通過運行調試,對比兩段程序的輸出結果,發(fā)現(xiàn)當時間改變時,程序的輸出結果也不相同,僅在程序2中輸出了預期的“ok”.進一步進行測試,發(fā)現(xiàn)在一天的24個時間段數(shù)據(jù)中,只有在2,5,8,11幾個時間點,程序輸出結果為計劃輸出的“ok”,其他時間段數(shù)據(jù)都不能輸出“ok”.

對于這個問題,查閱了很多資料和文獻都沒能找到對此問題的相關闡述,后自己通過程序調試、分析,采用將日期時間的原始值(內存中的存儲值)引用出來與程序運行值對比的方法進行研究,發(fā)現(xiàn)在不同時間點程序輸出結果出現(xiàn)誤差的根本原因在于VB中對于日期時間數(shù)據(jù)的存儲上,具體來說,就是在VB程序中,日期變量存儲形式為IEEE 64位 (8字節(jié))浮點形式,在這種形式中,數(shù)字表達的日期范圍從0100年1月1日至9999年12月31日,時間范圍從0:00:00到23:59:59.在這種存儲形式中,當一個數(shù)字的值轉換為日期類型時,小數(shù)部分表示時間,整數(shù)部分表示日期,其中日期,也就是整數(shù)部分一個單位為一天,時間部分就比較不容易確定了,例如0.0表示是午夜0點,0.5則表示是中午12點,在這種表示方法中,表示的精度由小數(shù)位數(shù)決定.

但我們知道,在計算機中,浮點數(shù)在進行計算的時候,最后幾位是不精確的,通常在很多程序設計的時候,浮點數(shù)參與比較運算是要做特別處理,有時為了運算需要,也采取將最后幾位舍掉的做法,在上述的兩段對比程序中,兩組不同時間點數(shù)據(jù)的輸出結果不一致的原因也是在此.

要證明這個問題,可以在程序調試、運行后,將日期時間變量的原始值復制出來,也就是使用Win32API函數(shù)調用memory copy函數(shù),把日期變量引用傳遞過去,具體說,就是對日期變量開始的8個字節(jié)的內存區(qū)進行復制,從而將日期變量的原始值復制出來進行計算、對比.

為了驗證上述觀點的正確性,我使用時間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函數(shù)將運算結果的原始值復制出來為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對日期時間進行差量計算或比較時誤差產(chǎn)生的原因就是在于使用浮點形式的數(shù)據(jù)存儲形式.

3 結束語

數(shù)據(jù)在程序中以常量或變量的方式被引用,不同的數(shù)據(jù)特點有不同的存儲要求和處理算法[3,4].在Visual Basic程序執(zhí)行期間,變量在用不同的數(shù)據(jù)類型時,有可能對程序的的運行結果產(chǎn)生誤差.

[1] 蔣文豪.Visual Basic在數(shù)據(jù)庫中的應用 [J].電腦知識與技術,2007,(02):933-934

[2] 施奈德著,張長富譯.Visual Basic 2008程序設計 (第7版)[M].北京:清華大學出版社,2009:113-121

[3] 劉模群.Visual Basic中參數(shù)傳遞的分析 [J].福建電腦,2009,(01):175

[4] 袁亞麗.淺談API函數(shù)在VB開發(fā)中的應用 [J].河北北方學院學報:自然科學版,2007,(05):47-49

猜你喜歡
數(shù)據(jù)類型程序設計運算
重視運算與推理,解決數(shù)列求和題
詳談Java中的基本數(shù)據(jù)類型與引用數(shù)據(jù)類型
基于Visual Studio Code的C語言程序設計實踐教學探索
有趣的運算
如何理解數(shù)據(jù)結構中的抽象數(shù)據(jù)類型
從細節(jié)入手,談PLC程序設計技巧
“整式的乘法與因式分解”知識歸納
基于SeisBase模型的地震勘探成果數(shù)據(jù)管理系統(tǒng)設計
高職高專院校C語言程序設計教學改革探索
PLC梯形圖程序設計技巧及應用