算术运算导致溢出-Vb.Net

时间:2018-09-20 08:32:12

标签: vb.net runtime-error

嗨,我在使用纳秒作为长时间计算GMT时间时遇到以下错误。

System.OverflowException :“算术运算导致溢出。”

是否还有另一种数据类型可以更好地处理大值?

Private Sub gmtime(ByVal iSeconds As Object, ByVal iNanoseconds As Long, ByRef Timestamp As String)

    Dim time As Object
    Dim islpyr, lpcnt As Long
    Dim t As Object
    Dim i As Object
    Dim ystart As Long
    Dim y As Long
    Dim sph As Object  'seconds per hour
    Dim spd As Object  'seconds per day
    Dim spy As Object  'seconds per year
    Dim tm_sec As Long
    Dim tm_min As Long
    Dim tm_hour As Long
    Dim tm_mday As Long
    Dim tm_mon As Long
    Dim tm_year As Long
    Dim tm_wday As Long
    Dim tm_yday As Long
    Dim tm_isdst As Long
    Dim mons(11) As Long
    Dim temp As Object
    Dim iMicroSeconds As Long
    Dim iZeroCount As Long
    Dim strZero As String
    Dim strMicro As String
    Dim iMicroData As Long

    mons(0) = 31
    mons(1) = 28
    mons(2) = 31
    mons(3) = 30
    mons(4) = 31
    mons(5) = 30
    mons(6) = 31
    mons(7) = 31
    mons(8) = 30
    mons(9) = 31
    mons(10) = 30
    mons(11) = 31

    sph = CDec(60 * 60)
    spd = CDec(24 * sph)
    spy = CDec(365 * spd + 6 * sph)   'a year is about 365.25 days

    tm_isdst = 0

    time = CDec(iSeconds)
    If time < 0 Then
        time = time * (-1)
    End If
    i = CDec(time)
    i = Fix(i / spd) Mod 7 + 4
    While i >= 7
        i = i - 7
    End While
    tm_wday = i
    temp = Fix(time / spd)
    temp = temp * spd
    i = time - temp
    tm_hour = Fix(i / sph) Mod 24
    tm_min = Fix(i / 60) Mod 60
    tm_sec = i Mod 60

    y = Fix(time / spy)
    y = y + 370
    time = Fix(time / spd)

    Do
        islpyr = 0
        If ((y Mod 4) = 0) And (((y Mod 100) <> 0) Or ((y Mod 400) = 0)) Then
            islpyr = 1
        End If
        lpcnt = Fix(y / 4)
        lpcnt = lpcnt - Fix(y / 100)
        lpcnt = lpcnt + Fix(y / 400)

        lpcnt = lpcnt - 89
        ystart = (y - 370) * 365 + lpcnt
        If ystart > time Then
            y = y - 1
        End If

    Loop While ystart > time

    time = time - ystart

    If time = 365 Then
        time = 0
        y = y + 1
    End If

    If islpyr Then
        time = time + 1
    End If
    tm_yday = time
    time = time + 1

    For i = 0 To 10
        t = mons(i)
        If (i = 1) And (islpyr = 1) Then
            t = t + 1
        End If
        If time <= t Then
            Exit For
        End If
        time = time - t
    Next i

    tm_year = y - 300 + 1900
    tm_mon = i + 1
    tm_mday = time

    strZero = "."
    iZeroCount = 6
    iMicroSeconds = Fix(iNanoseconds / 1000)
    iMicroData = iMicroSeconds
    While iMicroSeconds <> 0
        iMicroSeconds = Fix(iMicroSeconds / 10)
        If (iMicroData Mod 10) = 0 Then
            iMicroData = iMicroSeconds
        End If
        If iZeroCount <> 0 Then
            iZeroCount = iZeroCount - 1
        End If
    End While

    For i = 1 To iZeroCount
        strZero = strZero + "0"
    Next i

    If Fix(iNanoseconds / 1000) <> 0 Then
        strMicro = strZero + CStr(Fix(iNanoseconds / 1000))
    Else
        strMicro = strZero
    End If

    Timestamp = CStr(tm_year) + "-" + CStr(tm_mon) + "-" + CStr(tm_mday) + " " + CStr(tm_hour) + ":" + CStr(tm_min) + ":" + CStr(tm_sec) + strMicro

End Sub

我不会添加代码,因为帖子主要是代码。纳秒值来自波形文件,此功能用于将其处理为GMT时间。

在文件的每一行的循环上调用该函数,并在循环的中途返回此错误。

遇到错误时,值为“ 1.5518651852110167E + 270

1 个答案:

答案 0 :(得分:1)

很抱歉,但是无法在{strong> ANY 变量中放入10^270数字。

数字的最大变量是Long,它包含:

  

带符号的64位(8字节)整数,范围从   -9,223,372,036,854,775,8089,223,372,036,854,775,807   (9.2 ... E + 18 )。

来自Long DataType

我建议您避免以 nanoseconds 为单位计时,如果您的TimeSpan过大,请使用秒,分钟甚至几天。

以纳秒为单位的计数时间毫无意义。

备注

如果因为文件以纳秒为单位而无法避免使用纳秒,则唯一的选择是将每一行的DateTime格式转换为纳秒值,并希望该值小于 9.2E + 18 < / strong>

否则,您可以使用BigInteger并用它为文件的每一行计算DateTime

出于好奇:您需要一个896 bytes unsigned DataType来在其中存储1.5*10^270