我正在MsAccess中做一個愚蠢的有趣的專案,以毫秒為單位進行時間記錄。
當試圖將秒轉換為毫秒時,我得到了一個溢位錯誤。我已經確認我的系統是以 64 位運行的,而且我所做的數學運算甚至沒有接近邊界。
有誰知道發生了什么事?
有誰知道發生了什么事?
Public Subthis()
Dim this As LongLong
this = 474 * 86400 * 1000End Sub
uj5u.com熱心網友回復:
使用型別宣告字符,用于LongLong型別:
this = 474^ * 86400^ * 1000^
uj5u.com熱心網友回復:
你可以強制轉換為LongLong:
Public Sub this()。
Dim this As LongLong
this = CLngLng(474) *86400 *1000
Debug.Print這個
End Sub
uj5u.com熱心網友回復:
那么,為什么它不能作業呢?
VBA試圖根據數字的數量來轉換之前沒有宣告的數字。它從Integer開始 "思考",然后是Long,并且不能繼續猜測,直到你沒有特別宣告被乘的數字之一來接受必要的結果型別。它嘗試將結果放在上述猜測的型別中的一個。如果不可能,它就會回傳討論中的錯誤。因此,為了避免錯誤,它需要至少有一個被乘數被宣告為所需的結果型別,或者更大的型別。
請看下一個測驗Sub:
Sub testMultiplyingNumbers()
Dim x As LongLong, first As Variant
'x = 474 * 86400 * 1000 '回傳溢位(運行時錯誤'6')。
Debug.Print VarType(1000) 'return 2 (vbInteger)
Debug.Print VarType(474 * 86400) 'return 3 (vbLong)
first = 474 '接受高達1.797693134862315 E308的正值。
Debug.Print VarType(first * 86400 * 1000) '回傳 5 (vbDouble) 40953600000 承認。
'最大1.79769313486231570 E 308的正值。
x = CLngLng(476) * 86400 * 1000 '它是有效的。
x = 474^ * 86400 * 1000 'it worksCDbl(474) * 86400 * 1000 'it works)
x = first * 86400 * 1000 'it worksEnd Sub
uj5u.com熱心網友回復:
好吧,如果你使用的是Access x64,那么你可以使用LongLong,而且Steeve在使用型別字符(^)的帖子看起來相當不錯。(up-voted!!!).
然而,你可能希望保持x32位的兼容性,因為相當多的計算機仍在運行office x32位(它仍然是更常見的安裝版本--但這正在開始改變)。
因此,你可以使用雙數var(x32/x64均可使用),或者你可以使用打包的小數。包裝好的小數通常比雙倍數更受歡迎,因為它不會出現小數的四舍五入錯誤。
dim x as Variant
x = 474@ * 86400@ * 1000@
所以,雙數型別的作業是可行的,但它們有四舍五入的問題,所以上面將得到一個DECIMAL型別。這些數字的長度可以達到28位,而且它們實際上是一個縮放的整數型別(所以沒有浮點舍入錯誤。
如上所述,上述代碼的優點是可以在 Access 的 x32 和 x64 位版本中運行。
LongLong 僅在 Access x64 位中可用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/314189.html
標籤:
上一篇:C 中條件變數的問題
下一篇:從剃刀頁面呼叫方法


