vb.net - 算术运算导致溢出 - 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 '
解决方案
抱歉,没有办法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
。
推荐阅读
- typescript - 递归地为对象中的每个键添加后缀
- python - 使用传递给函数的变量从python中的类中调用成员
- android - 图像和搜索过滤器在 Xamarine 移动应用程序中的所有设备中都没有响应任何帮助线索?
- python - 如何制作Excel风格的线图
- java - 将通过docx4j修改的嵌入式excel数据直接加载到word文档中的饼图上
- excel - 按VBA中两个日期之间的时间段过滤Excel表格
- flutter - Flutter:泛型分配不适用于 T 的扩展类型
- amazon-web-services - Elastic Beanstalk ALB 上的多个 SSL 证书
- android - Gradle 错误:找不到符号变量 Settings_main
- flutter - 使用 POST 改造颤振错误。接收系统格式不正确