用户遇见情况:- 数值1="485136841646923285"
- 数值2="485136841646922472"
- TracePrint 数值1-数值2
- '按键调试输出结果是768
复制代码 检查原因:- 数值1="485136841646923285"/1
- TracePrint 数值1
- '按键调试输出结果4.85136841646923E+17
- '原因确认数值过长进入了科学计数
复制代码 解决思路1:(数值1、数值2分成1个个写入数组模拟人思维,一位位计算)- Dim 数据1(),数据2(),数据3()
- 数值1="485136841646923285"
- 数值2="485136841646922472"
- 数值1 = StrReverse(数值1)
- 数值2=StrReverse(数值2)
- For i = 1 To len(数值1)
- Redim Preserve 数据1(i)
- 数据1(i) = Mid(数值1, i, 1)
- //TracePrint 数据1(i)
- Next
- For i = 1 To len(数值2)
- Redim Preserve 数据2(i)
- 数据2(i) = Mid(数值2, i, 1)
- // TracePrint 数据2(i)
- Next
- If UBound(数据1) >= UBound(数据2) Then
- 最大 = UBound(数据1)
- Else
- 最大 = UBound(数据2)
- End If
- For i = 1 To 最大
- //TracePrint 数据1(i)
- If 数据1(i)/1 >= 数据2(i)/1 Then
- Redim Preserve 数据3(i)
- 数据3(i) = 数据1(i) / 1 - 数据2(i) / 1
- Else
- Redim Preserve 数据3(i)
- 数据3(i) = (数据1(i) / 1+10) - 数据2(i) / 1
- 数据1(i+1)=数据1(i+1)-1
- End If
- // TracePrint i
- TracePrint 数据2(i)&"---"&数据1(i)
- TracePrint 数据3(i)
- Next
- TracePrint StrReverse(join(数据3,""))
复制代码 思路1存在问题:(位数不统一的情况下会出现数组最大下标错误)


解决思路2:(取位数长的作为数组最大下标,解决思路1的数组下标错误问题)- Dim 数据1(),数据2(),数据3()
- 数值1="485136841646923285"
- 数值2="5136841646922472"
- 数值1 = StrReverse(数值1)
- 数值2 = StrReverse(数值2)
- If len(数值1) >= len(数值2) Then
- Redim Preserve 数据1(len(数值1))
- Redim Preserve 数据2(len(数值1))
- Else
- Redim Preserve 数据1(len(数值2))
- Redim Preserve 数据2(len(数值2))
- End If
- For i = 1 To len(数值1)
- 数据1(i) = Mid(数值1, i, 1)
- //TracePrint 数据1(i)
- Next
- For i = 1 To len(数值2)
- 数据2(i) = Mid(数值2, i, 1)
- // TracePrint 数据2(i)
- Next
- If UBound(数据1) >= UBound(数据2) Then
- 最大 = UBound(数据1)
- Else
- 最大 = UBound(数据2)
- End If
- For i = 1 To 最大
- //TracePrint 数据1(i)
- If 数据1(i) = "" Then 数据1(i)=0
- If 数据2(i) = "" Then 数据2(i)=0
- If 数据1(i)/1 >= 数据2(i)/1 Then
- Redim Preserve 数据3(i)
- 数据3(i) = 数据1(i) / 1 - 数据2(i) / 1
- Else
- Redim Preserve 数据3(i)
- 数据3(i) = (数据1(i) / 1+10) - 数据2(i) / 1
- 数据1(i+1)=数据1(i+1)-1
- End If
- // TracePrint i
- TracePrint 数据2(i)&"---"&数据1(i)
- TracePrint 数据3(i)
- Next
- TracePrint StrReverse(join(数据3,""))
复制代码 思路2存在问题:(正负不分)


思路3:(判断位数、大小后确定谁减谁,最终再决定加上-号不)思路3效果一览:



Dim 数据1(),数据2(),数据3()
数值1="485136841646923285"
数值2="485136841646922472"
If len(数值1) > len(数值2) Then
Redim Preserve 数据1(len(数值1))
Redim Preserve 数据2(len(数值1))
最大 = len(数值1)
结果="正"
End If
If len(数值1) < len(数值2) Then
Redim Preserve 数据1(len(数值2))
Redim Preserve 数据2(len(数值2))
最大 = len(数值2)
结果 = "负"
c=数值1
数值1= 数值2
数值2= C
End If
If len(数值1) = len(数值2) Then
For i = 1 To len(数值1)
If Mid(数值1, i, 1) > Mid(数值2, i, 1) Then
Redim Preserve 数据1(len(数值1))
Redim Preserve 数据2(len(数值1))
最大 = len(数值1)
结果 = "正"
Exit For
ElseIf Mid(数值1, i, 1) < Mid(数值2, i, 1) Then
Redim Preserve 数据1(len(数值2))
Redim Preserve 数据2(len(数值2))
最大 = len(数值2)
结果 = "负"
c=数值1
数值1= 数值2
数值2 = C
Exit For
End If
Next
End If
数值1 = StrReverse(数值1)
数值2 = StrReverse(数值2)
For i = 1 To len(数值1)
数据1(i) = Mid(数值1, i, 1)
//TracePrint 数据1(i)
Next
For i = 1 To len(数值2)
数据2(i) = Mid(数值2, i, 1)
// TracePrint 数据2(i)
Next
For i = 1 To 最大
//TracePrint 数据1(i)
If 数据1(i) = "" Then 数据1(i)=0
If 数据2(i) = "" Then 数据2(i)=0
If 数据1(i)/1 >= 数据2(i)/1 Then
Redim Preserve 数据3(i)
数据3(i) = 数据1(i) / 1 - 数据2(i) / 1
Else
Redim Preserve 数据3(i)
数据3(i) = (数据1(i) / 1+10) - 数据2(i) / 1
数据1(i + 1) = 数据1(i + 1) - 1
End If
TracePrint 数据1(i) & "-" & 数据2(i) & "=" & 数据3(i)
Next
最终数据 = StrReverse(join(数据3, ""))
For i = 1 To len(最终数据)
If mid(最终数据, i, 1) = "0" Then
累计=累计+1
Else
Exit For
End If
Next
If 结果 = "负" Then
TracePrint "-" & Mid(最终数据,(累计+1),len(最终数据))
Else
TracePrint Mid(最终数据,(累计+1),len(最终数据))
End Ifqq1452549351用户投稿
