2009-09-16 62 views
5

Tôi đã tự hỏi liệu có ai đó có thể giúp tôi không, vì tôi đã bị mù với những gì tôi tin là một nguyên nhân đơn giản cho một lỗi đơn giản.Lỗi tràn trong ASP Classic

tôi có mã này:

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) 

tôi nhận được lỗi này

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

gây ra bởi dòng này trong đoạn code trên:

y1 = denom1 - x1 mod denom1 

Bất kỳ ý tưởng? Như tôi đã nói, tôi đã bị mù vào tối nay

+0

Có thể x1 là vaule quá lớn cho Int/Long không? – Kane

Trả lời

1

Tôi tin rằng khi bạn không xác định cụ thể các giá trị, ASP Classic giả định giá trị số là int (chỉ 32767). Hãy thử buộc giá trị của bạn là chờ đợi

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 

Note: Tôi đã không thực sự thử nghiệm này.

+0

Câu trả lời cho câu hỏi này (http://stackoverflow.com/questions/316312/misunderstanding-of-long-data-type-in-vba) đi sâu hơn một chút về điều này. – NotMe

+0

@C. Ross: x1 = CLng (x1) gây ra 'Overflow: 'cLng'' –

+0

Trên thực tế, những người có lẽ nên tăng gấp đôi. Tuy nhiên, tôi nghi ngờ rằng bạn có câu trả lời đúng cách khác. Tôi khuyên bạn nên tăng gấp đôi vì một Long trong VBScript vẫn mũ tại 2B; cũng là đầu vào của OP có vẻ là một đôi dựa trên các ý kiến ​​trong bài viết. –

4

Câu trả lời dường như là tại PRB: "Overflow" with Integer Division and MOD Operator:

Các Visual Basic chủ điểm trợ giúp cho các Mod điều hành và các nhà điều hành phân chia số nguyên () giải thích rằng nếu nổi số điểm được sử dụng trong biểu thức , chúng được chuyển đổi thành Lần đầu tiên. Như vậy, nếu số điểm nổi lớn hơn giá trị tối đa của một lâu (2,147,483,647), hoặc thấp hơn giá trị tối thiểu cho một chặng đường dài (-2147483648), một lỗi tràn sẽ xảy ra.

Câu trả lời là sẵn có cũng như:

Đoạn mã dưới đây trình bày cách thực hiện phân chia số nguyên và modulo số học khi kích thước của một toán hạng là đủ lớn để gây ra tràn:

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

Bất kỳ lý do gì Int (x + .5) được sử dụng thay cho CInt (x)? – AnthonyWJones

+0

Ngoài ra nó sẽ là tốt hơn để chỉnh sửa mã để VBScript vì đây là một câu hỏi ASP cổ điển không phải là một câu hỏi VB6. +1 mặc dù – AnthonyWJones

Các vấn đề liên quan