2009-09-16 49 views
5

Me preguntaba si alguien podría ayudarme, ya que me he quedado ciego ante lo que creo que es una causa simple de un error simple.Desbordamiento en ASP Classic

tengo este código:

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) 

consigo este error

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

Causada por esta línea en el código anterior:

y1 = denom1 - x1 mod denom1 

¿Alguna idea? Como digo, me he quedado ciego este p.m.

+0

¿Podría ser que x1 es un vaule demasiado grande para un int/largo? – Kane

Respuesta

1

Creo que cuando no se definen específicamente los valores, ASP Classic supone que un valor numérico es un int (que es solo 32767). Intentar forzar sus valores para ser anhela

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 

Nota: En realidad no he probado esto.

+0

La respuesta en este (http://stackoverflow.com/questions/316312/misunderstanding-of-long-data-type-in-vba) entra en detalles un poco más sobre esto. – NotMe

+0

@C. Ross: x1 = CLng (x1) causa 'Desbordamiento: 'cLng'' –

+0

En realidad, esos deberían ser Dobles. Sin embargo, sospecho que tienes la respuesta correcta de lo contrario. Recomiendo dobles porque un Largo en VBScript todavía está limitado a 2B; también la entrada de OP parece ser un doble según los comentarios en la publicación. –

4

La respuesta parece estar en PRB: "Overflow" with Integer Division and MOD Operator:

El Visual tema de Ayuda básico para el operador Mod y el operador de división de enteros () explica que si flotantes números de punto se utilizan en la expresión , se convierten a Longs first. Por lo tanto, si el número punto flotante es mayor que el valor máximo de una larga (2147483647), o menor que el valor mínimo por un largo (-2147483648), se producirá un error de desbordamiento .

La respuesta está disponible allí también:

El código siguiente muestra cómo realizar la división de enteros y modulo aritmética cuando el tamaño de un operando es suficientemente grande para causar 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

¿Alguna razón se usa Int (x + .5) en lugar de CInt (x)? – AnthonyWJones

+0

También sería mejor editar el código en VBScript ya que esta es una pregunta ASP clásica, no una pregunta VB6. +1 aunque – AnthonyWJones

Cuestiones relacionadas