2011-04-08 76 views
2

我想將十進制數轉換爲十六進制,內置的十六進制功能限制爲8個字符,所以我不得不寫我自己的功能,但VBScript似乎將數字四捨五入到小數點後兩位。VBScript分區 - 自動將結果舍入到2位小數

舉例來說。

16分之106681252129194= 6667578258074.625

的問題是,當我做在VBScript此代碼

strResult = 106681252129194/16 

結果是6667578258074.63,這使得計算十六進制位的輕微問題。

回答

1

你必須做一個整數除法和餘數運算。應邀在一個數(雙< 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 
+0

而不是使用Fix (x/y)可以使用VBScript的整數除法運算符:x \ y。 – Tmdean 2011-04-11 16:14:28

+0

@Tmdean:不,你不能。 (見編輯答案)。 – 2011-04-11 17:18:27

0

您超出了類型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.

+0

即使存儲在變體中,VBScript也不支持小數。 CDec函數不存在,即使你得到一個十進制數(例如,從一個數據庫通過ADO),你也必須將它轉換爲Double來比較或操作它。 – 2011-04-11 01:18:19

+0

哎呀,你是對的!我的錯。 – 2011-04-11 11:00:50

+0

謝謝,稍微有一點點。 – 2011-04-18 10:37:56

相關問題