首页 > 解决方案 > 算术运算导致溢出 - Vb.Net

问题描述

嗨,我在使用纳秒计算 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 '

标签: vb.netruntime-error

解决方案


抱歉,没有办法10^270任何变量中输入数字。

数字的最大变量是Long

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

长数据类型

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

以纳秒为单位计算时间是没有意义的。

评论

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

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

只是出于好奇:您需要 a896 bytes unsigned DataType在其中存储 a 1.5*10^270


推荐阅读