• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[老狼] [老狼][源码分享]----解决数值过长计算错误----遇见蔷薇泡沫(33) [复制链接]

1#
用户遇见情况:
  1. 数值1="485136841646923285"
  2. 数值2="485136841646922472"
  3. TracePrint 数值1-数值2
  4. '按键调试输出结果是768
复制代码
检查原因:
  1. 数值1="485136841646923285"/1
  2. TracePrint 数值1
  3. '按键调试输出结果4.85136841646923E+17
  4. '原因确认数值过长进入了科学计数
复制代码
解决思路1:(数值1、数值2分成1个个写入数组模拟人思维,一位位计算)
  1. Dim 数据1(),数据2(),数据3()
  2. 数值1="485136841646923285"
  3. 数值2="485136841646922472"
  4. 数值1 = StrReverse(数值1)
  5. 数值2=StrReverse(数值2)
  6. For i = 1 To len(数值1)
  7. Redim Preserve 数据1(i)
  8. 数据1(i) = Mid(数值1, i, 1)
  9. //TracePrint 数据1(i)
  10. Next
  11. For i = 1 To len(数值2)
  12. Redim Preserve 数据2(i)
  13. 数据2(i) = Mid(数值2, i, 1)
  14. // TracePrint 数据2(i)
  15. Next
  16. If UBound(数据1) >= UBound(数据2) Then
  17. 最大 = UBound(数据1)
  18. Else
  19. 最大 = UBound(数据2)
  20. End If
  21. For i = 1 To 最大
  22. //TracePrint 数据1(i)
  23. If 数据1(i)/1 >= 数据2(i)/1 Then
  24. Redim Preserve 数据3(i)
  25. 数据3(i) = 数据1(i) / 1 - 数据2(i) / 1
  26. Else
  27. Redim Preserve 数据3(i)
  28. 数据3(i) = (数据1(i) / 1+10) - 数据2(i) / 1
  29. 数据1(i+1)=数据1(i+1)-1
  30. End If
  31. // TracePrint i
  32. TracePrint 数据2(i)&"---"&数据1(i)
  33. TracePrint 数据3(i)
  34. Next
  35. TracePrint StrReverse(join(数据3,""))
复制代码
思路1存在问题:(位数不统一的情况下会出现数组最大下标错误)



解决思路2:(取位数长的作为数组最大下标,解决思路1的数组下标错误问题)
  1. Dim 数据1(),数据2(),数据3()
  2. 数值1="485136841646923285"
  3. 数值2="5136841646922472"
  4. 数值1 = StrReverse(数值1)
  5. 数值2 = StrReverse(数值2)
  6. If len(数值1) >= len(数值2) Then
  7. Redim Preserve 数据1(len(数值1))
  8. Redim Preserve 数据2(len(数值1))
  9. Else
  10. Redim Preserve 数据1(len(数值2))
  11. Redim Preserve 数据2(len(数值2))
  12. End If
  13. For i = 1 To len(数值1)
  14. 数据1(i) = Mid(数值1, i, 1)
  15. //TracePrint 数据1(i)
  16. Next
  17. For i = 1 To len(数值2)
  18. 数据2(i) = Mid(数值2, i, 1)
  19. // TracePrint 数据2(i)
  20. Next
  21. If UBound(数据1) >= UBound(数据2) Then
  22. 最大 = UBound(数据1)
  23. Else
  24. 最大 = UBound(数据2)
  25. End If
  26. For i = 1 To 最大
  27. //TracePrint 数据1(i)
  28. If 数据1(i) = "" Then 数据1(i)=0
  29. If 数据2(i) = "" Then 数据2(i)=0
  30. If 数据1(i)/1 >= 数据2(i)/1 Then
  31. Redim Preserve 数据3(i)
  32. 数据3(i) = 数据1(i) / 1 - 数据2(i) / 1
  33. Else
  34. Redim Preserve 数据3(i)
  35. 数据3(i) = (数据1(i) / 1+10) - 数据2(i) / 1
  36. 数据1(i+1)=数据1(i+1)-1
  37. End If
  38. // TracePrint i
  39. TracePrint 数据2(i)&"---"&数据1(i)
  40. TracePrint 数据3(i)
  41. Next
  42. 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用户投稿

最后编辑瑞祥幽冥狼 最后编辑于 2022-03-11 00:42:29
本主题由 超级版主 瑞祥幽冥狼 于 2022/3/11 8:23:30 执行 审核帖子 操作
收 徒 索 引 ← ← ← ← ← ← ← ← ← ← 点 击

个 人 Q Q 1 : 1 2 2 3 1 1 6 6 1 8[将满]
个 人 Q Q 2 : 6 1 7 0 9 5 5 4 3[可加]
2#

66666666666

3#


4#

感谢感谢 我来学习了

5#

感谢分享

6#


7#

学习学习

8#

1234567899999999999999999

635787403
9#

学习

看看

发新话题 回复该主题