我想將十進制數轉換爲十六進制,內置的十六進制功能限制爲8個字符,所以我不得不寫我自己的功能,但VBScript似乎將數字四捨五入到小數點後兩位。VBScript分區 - 自動將結果舍入到2位小數
舉例來說。
16分之106681252129194= 6667578258074.625
的問題是,當我做在VBScript此代碼
strResult = 106681252129194/16
結果是6667578258074.63,這使得計算十六進制位的輕微問題。
我想將十進制數轉換爲十六進制,內置的十六進制功能限制爲8個字符,所以我不得不寫我自己的功能,但VBScript似乎將數字四捨五入到小數點後兩位。VBScript分區 - 自動將結果舍入到2位小數
舉例來說。
16分之106681252129194= 6667578258074.625
的問題是,當我做在VBScript此代碼
strResult = 106681252129194/16
結果是6667578258074.63,這使得計算十六進制位的輕微問題。
你必須做一個整數除法和餘數運算。應邀在一個數(雙< 2^50)看看我的企圖ASCII功能:
Function ntoa(nNum, iBase)
ntoa = "0"
If nNum Then
ntoa = Mid("-", Sgn(nNum) + 2) + ntoaPos(Abs(nNum), iBase)
End If
End Function
Function ntoaPos(nNum, iBase)
If nNum >= 1 Then
Dim nD : nD = Fix(nNum/iBase)
Dim nM : nM = nNum - nD * iBase
ntoaPos = ntoaPos(nD, iBase) _
& Mid("ABCDEFGHIJKLMNOPQRSTUV", 1 + nM, 1)
End If
End Function
基本測試代碼:
Dim aTests : aTests = Array(_
"zero (default: long)", 0 _
, "zero (Byte)" , CByte( 0 ) _
, "min_long" , CLng(-2^31 ) _
, "max_long" , CLng( 2^31-1) _
, "min_long - 1" , -2^31-1 _
, "max_long + 1" , 2^31 _
, "max_ulong" , 4294967295 _
, "big" , 2^40 _
, "bigger" , 2^45 _
, "bigger-1" , 2^45-1 _
, "bigger-11" , 2^45-11 _
, "very big" , 2^50 _
)
Dim nTest
For nTest = 0 To UBound(aTests) Step 2
WScript.Echo "-----", nTest \ 2, aTests(nTest)
Dim nVal : nVal = aTests(nTest + 1)
WScript.Echo " Type:", TypeName(nVal), VarType(nVal)
WScript.Echo " Value:", nVal
WScript.Echo " hexxed:", ntoa(nVal, 16)
WScript.Echo " decced:", ntoa(nVal, 10)
WScript.Echo " abced:", ntoa(nVal, 32)
Next
輸出:
----- 0 zero (default: long)
Type: Integer 2
Value: 0
hexxed: 0
decced: 0
abced: 0
----- 1 zero (Byte)
Type: Byte 17
Value: 0
hexxed: 0
decced: 0
abced: 0
----- 2 min_long
Type: Long 3
Value: -2147483648
hexxed: -80000000
decced: -2147483648
abced: -2000000
----- 3 max_long
Type: Long 3
Value: 2147483647
hexxed: 7FFFFFFF
decced: 2147483647
abced: 1VVVVVV
----- 4 min_long - 1
Type: Double 5
Value: -2147483649
hexxed: -80000001
decced: -2147483649
abced: -2000001
----- 5 max_long + 1
Type: Double 5
Value: 2147483648
hexxed: 80000000
decced: 2147483648
abced: 2000000
----- 6 max_ulong
Type: Double 5
Value: 4294967295
hexxed: FFFFFFFF
decced: 4294967295
abced: 3VVVVVV
----- 7 big
Type: Double 5
Value: 1099511627776
hexxed: 10000000000
decced: 1099511627776
abced: 100000000
----- 8 bigger
Type: Double 5
Value: 35184372088832
hexxed: 200000000000
decced: 35184372088832
abced: 1000000000
----- 9 bigger-1
Type: Double 5
Value: 35184372088831
hexxed: 1FFFFFFFFFFF
decced: 35184372088831
abced: VVVVVVVVV
----- 10 bigger-11
Type: Double 5
Value: 35184372088821
hexxed: 1FFFFFFFFFF5
decced: 35184372088821
abced: VVVVVVVVL
----- 11 very big
Type: Double 5
Value: 1,12589990684262E+15
hexxed: 4000000000000
decced: 1125899906842624
abced: 10000000000
順便說一句 - 您不能使用\:
>> a = 2^32
>> WScript.Echo a
>> b = a/2
>> WScript.Echo b
>> c = a \ 2
>> WScript.Echo c
>>
4294967296
2147483648
Error Number: 6
Error Description: Overflow
您超出了類型Double
提供的精度,即8個字節。
這不是真的那個部門自動將事情舍入到小數點後兩位;這只是你的3位小數位無處可去,因此被取消了。
一種解決方案是使用類型Decimal
,它提供了14個字節的存儲空間。
Dim r As Decimal
r = 106681252129194)/16 ' r = 6667578258074.625
注:以上是針對VB的。在VBA和VBScript中,Decimal
類型只能在Variant
內訪問。您不能直接聲明Decimal
類型的變量;您必須使用CDec
函數創建一個Variant
然後使其亞型Decimal
:
Dim r
r = CDec(106681252129194)/CDec(16) ' r = 6667578258074.625
它仍然是好是謹慎... Decimal
會給你28-29顯著的數字,而Double
只給你14- 15。另一方面,Double
爲您提供了在-324和+308之間的10次冪的靈活性,如同在科學記數法中一樣,而使用Decimal
則表明您使用直線符號,沒有冪次數爲10.
即使存儲在變體中,VBScript也不支持小數。 CDec函數不存在,即使你得到一個十進制數(例如,從一個數據庫通過ADO),你也必須將它轉換爲Double來比較或操作它。 – 2011-04-11 01:18:19
哎呀,你是對的!我的錯。 – 2011-04-11 11:00:50
謝謝,稍微有一點點。 – 2011-04-18 10:37:56
而不是使用Fix (x/y)可以使用VBScript的整數除法運算符:x \ y。 – Tmdean 2011-04-11 16:14:28
@Tmdean:不,你不能。 (見編輯答案)。 – 2011-04-11 17:18:27