【问题标题】:VB: Calcute mean/average for udt arrayVB:计算 udt 数组的平均值/平均值
【发布时间】:2013-10-25 03:15:07
【问题描述】:

我有一个结构数组

Private Type udtSingle
    Dim Count As Long
    Dim Value As Single
end Type

Private m(2) As udtSingle

假设数组是这样填充的:

m(0).Count = 5
m(0).Value = 100
m(1).Value = 1
m(1).Count = 10

你可以看到我们有 5*100 和 1*10。

计算平均值的最佳方法是什么?

for i as integer = 0 to m.upperbound()
     cAll += m(i).Count * m(i).Value
     iCount+=m(i).Count
next i

dim average as currency
average = cAll / iCount

这可行,但我的 .Count 和高 .Value 真的很多,而且我担心溢出。

请问我还能做什么?

如果数组变得非常大,无论如何我都会溢出。我不能在 for-next-statement 中重新计算平均值吗?我想是的,但我能想到一个优雅的解决方案。

ps:是的,我知道,代码是一种伪代码......

【问题讨论】:

  • VB.Net 不再支持Type 声明。现在是structure。你在用 vb.net 吗?
  • 我正在使用 VB6。但我认为回复可以在 .NET 中,我可以将其翻译为 VB6,除非有人建议使用 .NET 的更大功能来容纳大量数字。
  • 我还是建议使用 LINQ - 当然,您不能将其转换回 vb6。无论如何,vb.net 也没有问题,因为它将 single 分配给乘法的结果,它可以容纳相当大的数字;)

标签: vb6 average mean


【解决方案1】:

cAll 声明为Double 以避免溢出。

Dim cAll as Double

然后

cAll += Convert.ToDouble(m(i).Count) * Convert.ToDouble(m(i).Value)

双倍范围最高约为 ±1.7 × 10^308。

【讨论】:

  • 那无济于事。我已经更新了我的帖子以使其更加清晰。
  • 为什么?真的看不出来,但也许我错过了什么?
  • 我想避免在 for-next-statement 之后计算平均值。如果可能的话,我想在每个之后计算它。顺便说一句,与 VB.NET 不同,我正在使用 VB6,其中变量不能保存大量数据。
  • VB6 double max 是 1.79E+308,你觉得你需要的不止这些吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2012-06-19
  • 2017-02-06
  • 2014-05-14
相关资源
最近更新 更多