Переполнение в ASP Classic - PullRequest
5 голосов
/ 16 сентября 2009

Мне было интересно, может ли кто-нибудь мне помочь, потому что я ослеп на то, что я считаю простой причиной простой ошибки.

У меня есть этот код:

 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)

Я получаю эту ошибку

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

Вызывается этой строкой в ​​приведенном выше коде:

 y1 = denom1 - x1 mod denom1

Есть идеи? Как я уже сказал, в этот час я ослеп.

Ответы [ 2 ]

4 голосов
/ 16 сентября 2009

Ответ выглядит как PRB: «переполнение» с целочисленным делением и оператором MOD :

Раздел справки по Visual Basic для Мод оператора и целочисленное деление оператор () объясняет, что если плавающий номера точек используются в выражение, они преобразуются в Сначала длинные. Таким образом, если плавающий номер точки больше, чем максимальное значение длинного (2 147 483 647) или меньше минимальное значение для длинного (-2 147 483 648), ошибка переполнения произойдет.

Ответ также доступен там:

Следующий код демонстрирует, как выполнить целочисленное деление и по модулю арифметика, когда размер операнда достаточно большой, чтобы вызвать Переполнение:

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) )
1 голос
/ 16 сентября 2009

Я полагаю, что, когда вы не определяете значения конкретно, ASP Classic предполагает, что числовое значение равно int (что составляет всего 32767). Попробуйте заставить ваши значения быть длинными

 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

Примечание : Я на самом деле не проверял это.

...