2009-09-16 21 views
5

Birinin bana yardım edip edemeyeceğini merak ettim, çünkü basit bir hatanın basit bir sebebi olduğuna inandığım körlüğe gittim.ASP Classic'te taşma

y1 = denom1 - x1 mod denom1 

herhangi bir fikir: Yukarıdaki kodda bu hat Yarattığı bu hatayı

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

olsun

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) 

:

Bu kodu vardır? Dediğim gibi, bu körü kör ettim.

+0

burada olman o x1 bir vaule bir Int/Uzun için çok büyük? – Kane

cevap

1

Değerleri özel olarak tanımlamadığınız zaman, ASP Classic bir int olarak sayısal bir değer atar (yalnızca 32767'dir). uzun

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 

Not olmak için değerleri zorlayan deneyin: Aslında bu test etmedim.

+0

Bu sorunun cevabı (http://stackoverflow.com/questions/316312/misunderstanding-of-long-data-type-in-vba) bunun hakkında biraz daha ayrıntıya giriyor. – NotMe

+0

@C. Ross: x1 = CLng (x1) neden taşma: 'cLng' ' –

+0

Aslında, bunlar muhtemelen Çiftler olmalıdır. Ancak, aksi halde doğru cevabınız olduğundan şüpheleniyorum. Çiftler öneririm çünkü VBScript'te bir Long hala 2B'de kapanır; Ayrıca OP'nin girdisi, gönderideki yorumlara dayanarak iki katına çıkar. –

4

cevap PRB: "Overflow" with Integer Division and MOD Operator yerde belirdi:

Mod operatörü ve tamsayı bölme operatör için Visual Basic Yardım konusu() açıklıyor kayan nokta numaraları ifadesinde kullanılırsa, Önce Longs'e dönüştürülür. Kayan nokta sayısı uzun (-2,147,483,648) için minimum değerden daha uzun bir (2,147,483,647) arasında maksimum değerinden daha büyüktür ya da daha az olduğu taktirde, bir taşma hata ortaya çıkar.

cevap orada da mevcuttur:

Aşağıdaki kod bir terimin boyutu taşmasına neden olmak için yeterince büyük olduğu zaman için tamsayı bölme gerçekleştirmek ve aritmetik modulo gösterilmiştir:

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

CInt (x) yerine Int (x + .5) kullanılmasının herhangi bir nedeni var mı? – AnthonyWJones

+0

Ayrıca bir VB6 sorusu değil klasik bir ASP sorusu olduğundan, kodu VBScript'e düzenlemek daha iyi olurdu. Olsa da +1 – AnthonyWJones