5

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

我有这个代码:

 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

有任何想法吗?正如我所说,我已经在这个下午失明了

4

2 回答 2

4

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

Mod 运算符和整数除法运算符 () 的 Visual Basic 帮助主题解释说,如果在表达式中使用浮点数,它们首先被转换为 Longs。因此,如果浮点数大于 Long 的最大值 (2,147,483,647),或小于 long 的最小值 (-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) )
于 2009-09-16T14:58:25.660 回答
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

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

于 2009-09-16T14:45:26.773 回答