Vb.net 如何在txt文件中输出一组数字的平均值?

Vb.net 如何在txt文件中输出一组数字的平均值?,vb.net,Vb.net,到目前为止我有这个,但它只输出0 Option Explicit On Option Strict On Option Infer Off Public Class frmMain Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click Me.Close() End Sub Private Sub btnCalc_Click(sender As

到目前为止我有这个,但它只输出0

Option Explicit On
Option Strict On
Option Infer Off

Public Class frmMain
    Private Sub btnExit_Click(sender As Object, e As EventArgs) Handles btnExit.Click
        Me.Close()
    End Sub

    Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
        Dim inFile As IO.StreamReader
        Dim intBill As Integer
        Dim avg As Integer
        Dim trueAvg As Integer

        If IO.File.Exists("monthlyBills.txt") Then
            inFile = IO.File.OpenText("monthlyBills.txt")
            Do Until inFile.Peek = -1
                Integer.TryParse(inFile.ReadLine, intBill)
                avg += intBill
            Loop
            inFile.Close()
            trueAvg = CInt(avg / 12D)
            lblAvg.Text = trueAvg.ToString()
        Else
            MessageBox.Show("Cannot find the file.", "monthlyBills",
                            MessageBoxButtons.OK, MessageBoxIcon.Information)
            lblAvg.Text = "N/A"
        End If
    End Sub
End Class
以下是“monthlyBills.txt”文本文件:

141.71
156.75
179.25
141.71
130.19
115.05
95.65
86.78
85.45
79.99
98.45
126.78

问题在于,文本文件中的值都不是整数,但您试图将它们解析为整数。您应该使用
Decimal
类型

还有一件事,每当使用
.TryParse()
方法时,您可能需要检查其返回值以确保解析是否成功。在这种情况下,
If
语句会有所帮助

这应该很好:

Dim inFile As IO.StreamReader
Dim intBill As Decimal
Dim avg As Decimal
Dim trueAvg As Integer

If IO.File.Exists(filePath) Then
    inFile = IO.File.OpenText(filePath)
    Do Until inFile.Peek = -1
        If Decimal.TryParse(inFile.ReadLine, intBill) Then
            avg += intBill
        Else
            ' TODO: decide what you should do if a line isn't a decimal value.
        End If
    Loop
    inFile.Close()
    trueAvg = CInt(avg / 12D)
    lblAvg.Text = trueAvg.ToString()
Else
    MessageBox.Show("Cannot find the file.", "monthlyBills",
                    MessageBoxButtons.OK, MessageBoxIcon.Information)
    lblAvg.Text = "N/A"
End If
笔记:
  • 我将
    inBill
    avg
    的类型都更改为
    Decimal
    ,但将
    trueAvg
    保留为整数,以防需要舍入结束值。如果您没有具体的原因,那么应该使用十进制,并去掉
    CInt

  • NET中的浮点数可以表示为两种不同的类型;二进制表示法(如
    类型)和十进制表示法(十进制类型)。对于您的特殊情况,我建议使用
    Decimal
    ,因为您似乎在处理价格问题,而
    Decimal
    更合适。你可以阅读更多关于这一差异的文章


要使用没有
.TryParse
的方法,必须确保文本文件中的每一行都是一个数字

.ReadAllLines
返回一个数组,其中每个元素都是文本文件中的一行

接下来,我们使用一点Linq将每一行(一个字符串)更改为十进制值。
.Trim
删除可能存在的任何空白。不要担心
IEnumerable
。这就是Linq的回报。它只是意味着你可以用一个
循环遍历它

然后我们可以在
IEnumerable
上调用
.Average
方法,我们就完成了

Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
    Dim lines As String() = File.ReadAllLines("monthlyBills.txt")
    Dim decs As IEnumerable(Of Decimal) = From line In lines
                                          Select CDec(line.Trim)
    Dim avg As Decimal = decs.Average
    lblAvg.Text = avg.ToString("N2")
End Sub
下面是另一个不使用Linq查询而使用.TryParse的示例。如果使用列表而不是数组,则不必事先知道要添加多少项。此外,您不需要跟踪索引。您仍然使用列表中的.Average方法

Private Sub btnCalc_Click(sender As Object, e As EventArgs) Handles btnCalc.Click
    Dim lines As String() = File.ReadAllLines("monthlyBills.txt")
    Dim decs As New List(Of Decimal)
    Dim dec As Decimal

    For Each line As String In lines
        If Decimal.TryParse(line, dec) Then
            decs.Add(dec)
        Else
            MessageBox.Show(line & " is not a number and is being excluded from calculations.")
        End If
    Next

    Dim avg As Decimal = decs.Average
    lblAvg.Text = avg.ToString("N2")
End Sub

(顺便说一句,祝贺:)2个小音符(给OP)<代码>平均值
不是平均值,而是总和。所以,这个名字有误导性
12D
不应硬编码,它应表示从文件中读取并实际解析的元素的计数。如答案所示,
TryParse
返回一个
布尔值,以指示解析是否成功。您的值都不是整数,因此解析总是失败的。当
TryParse
返回
False
时,输出参数设置为零。这就解释了为什么结果是零。这都在文档中,您可以在调试器中看到这一切。如果您还没有阅读相关文档或调试代码,那么现在就在这里发布还为时过早。对于您试图解决但无法解决的问题也是如此。阅读和调试是尝试的一部分。在第一段代码中,平均值可以是dime=Decimal.Round(lines.average(Function)CDec(s)),2)
@Jimi感谢您的一行代码!我对那些功能的东西还是有点不确定。