ASP Classic溢出

时间:2009-09-16 14:34:10

标签: asp-classic overflow

我想知道是否有人可以帮助我,因为我对我认为是一个简单错误的简单原因视而不见。

我有这段代码:

 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 个答案:

答案 0 :(得分:4)

答案似乎在PRB: "Overflow" with Integer Division and MOD Operator

  

Visual Basic帮助主题   Mod运算符和整数除法   operator()解释说如果浮动   点数用于   表达,他们被转换为   渴望第一。因此,如果浮动   点数大于   最大值   (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 :(得分:1)

我相信当你没有专门定义这些值时,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

注意:我实际上没有测试过这个。