2009-09-16 11 views
5

Zastanawiałem się, czy ktoś mógłby mi pomóc, ponieważ oślepłem na tym, co moim zdaniem jest prostą przyczyną prostego błędu.Przepełnienie w ASP Classic

mam ten kod:

doRound1(x1) 
    denom1 = 5 
    y1 = denom1 - x1 mod denom1 
    if y1 <> denom1 then 
    x1= x1+y1 
    end if 

    doRound1=x1 
End function 

'theCalc = 20488888888.684 
    theCalc = cDbl(11111111111) * 1.844 
    doRound1(theCalc) 

otrzymuję ten błąd

Microsoft VBScript runtime error '800a0006' 
Overflow: 'x1' 

spowodowane przez tę linię w powyższym kodzie:

y1 = denom1 - x1 mod denom1 

jakieś pomysły? Jak już mówiłem, oślepłem tego p.m.

+0

Czy to możliwe, że x1 jest vaule zbyt duży dla int/długi? – Kane

Odpowiedz

1

Wierzę, że jeśli nie zdefiniujesz konkretnie wartości, ASP Classic przyjmuje wartość liczbową jako int (która wynosi tylko 32767). Spróbuj zmuszając swoje wartości za tęskni

Function doRound1(x1) 
    x1 = CDbl(x1) 
    denom1 = CDbl(5) 
    y1 = denom1 - x1 mod denom1 
    if y1 <> denom1 then 
    x1= x1+y1 
    end if 

    doRound1=x1 
End function 

Note: Nie rzeczywiście przetestowane.

+0

Odpowiedź na ten temat (http://stackoverflow.com/questions/316312/misunderstanding-of-long-data-type-in-vba) idzie o trochę więcej szczegółów na ten temat. – NotMe

+0

@C. Ross: x1 = CLng (x1) powoduje 'Overflow: 'cLng'' –

+0

Właściwie powinny to być podwójne. Podejrzewam jednak, że w przeciwnym razie masz właściwą odpowiedź. Polecam podwojenie, ponieważ długo w VBScript nadal wynosi 2B; również dane wejściowe OP wydają się być podwójne w oparciu o komentarze w poście. –

4

Odpowiedź wydaje się być w PRB: "Overflow" with Integer Division and MOD Operator:

Visual Basic Temat pomocy dla operatora Mod i operatora podział całkowitą () wyjaśnia, że ​​jeśli pływające numery punktowe są wykorzystywane w wyrażeniu , są konwertowane na Longs jako pierwsze. Zatem, jeżeli liczba pływający punkt jest większa niż maksymalna wartość długiego (2,147,483,647) , lub mniej niż minimalnej wartości przez długi (-2,147,483,648), błąd przepełnienia nastąpi.

Odpowiedź jest dostępny również tam:

Poniższy kod demonstruje sposób wykonać dzielenie liczb całkowitych i modulo arytmetyki gdy rozmiar argumentu jest wystarczająco duża, aby spowodować overflow:

Dim dblX as Double 
Dim dblY as Double 
dblX = 2147483648    ' numerator 
dblY = 123      ' denominator 

' round off the numerator and denominator (ensure number is .0) 
dblX = INT(dblX + .5)   
dblY = INT(dblY + .5)  

' Emulate integer division 
MsgBox FIX(dblX/dblY)    
' Emulate modulo arithmetic 
MsgBox dblX - (dblY * FIX(dblX/dblY)) 
+0

Dowolny powód Int (x + .5) jest używany zamiast CInt (x)? – AnthonyWJones

+0

Również lepiej byłoby zmodyfikować kod do VBScript, ponieważ jest to klasyczne pytanie ASP, a nie pytanie VB6. +1 – AnthonyWJones

Powiązane problemy