VB 表单不会检测和使用变量中存储的数字



我正在写一个简单的VB表单来计算电费。源代码如下:

Private Sub BtnCalculate_Click(sender As Object, e As EventArgs) Handles BtnCalculate.Click
        Dim LowUnits As Integer
        'LowUnits is the cost per unit if the integer is lower than [Difference Variable]
        Dim HighUnits As Integer
        'HighUnits is the cost per unit if the integer is higher than [Difference Variable]
        Dim FixedFee As Integer
        'This is the fixed infrastructure fee that all providers charge alongside unit cost
        Dim Difference As Integer
        'Number of units before a premium price [High Units Variable] is charged
        Dim UnitNo As Integer
        'Number of Units that is inputted
        Dim Price As Double

        UnitNo = UnitBox.Text
        If RdoEE.Checked = True Then
            LowUnits = 0.04
            HighUnits = 0.06
            FixedFee = 10
            Difference = 500
        ElseIf RdoPG.Checked = True Then
            LowUnits = 0.04
            HighUnits = 0.06
            FixedFee = 15
            Difference = 600
        ElseIf RdoBG.Checked = True Then
            LowUnits = 0.03
            HighUnits = 0.05
            FixedFee = 20
            Difference = 500
        End If
        If UnitNo <= Difference Then
            Price = 1
            Price = Price * UnitNo
            Price = UnitNo * LowUnits
            Price = Price + FixedFee
        Else
            'Price = ((((Price + 1) * UnitNo) * HighUnits) + FixedFee)
        End If

        MsgBox("Your cost is £" & Price & "")

    End Sub
End Class

程序是这样工作的:输入no。对于每月的电力单位,选择一个供应商(有不同的费率和固定的基础设施费用),这就输出了总成本。我遇到的问题是,程序似乎没有检测到单位的成本,并将它们存储在Price变量中,只包括固定费用,不计算单位。到目前为止,我还没有做错误处理,因为我的重点是让程序工作,这是我的优先事项。

我必须满足的条件是:编写一个程序,计算供应商的单位成本,并为客户输出总成本。该程序必须从3家不同的供应商(EDF Energy、PowerGen和British Gas)中进行选择,并必须输出总成本。法国电力公司的电费为每单位0.04英镑,不超过500台,每单位0.06英镑,其中包括10英镑的固定基础设施费。PowerGen的收费是每台0.04英镑,不超过600台,每台0.06英镑,其中包括15英镑的固定基础设施费。英国天然气公司每台收费0.03英镑,500台后收费0.05英镑,其中包括20英镑的固定基础设施成本。"

您在Integer值中存储小数值(例如0.04),这是您的问题,和VB。. NET没有警告你精度的损失。

将本地变量从Integer更改为Decimal -当使用货币值时总是更喜欢Decimal而不是Double,因为像0.1这样的简单值不能准确表示。或者更好:使用整数,但使用便士作为基数值而不是英镑(因此1 ==£0.01和100 ==£1)。

其他提示:

  • 本地值应该使用camelCase,而不是TitleCase
  • 不要使用匈牙利符号,它现在被认为是不好的做法(并且在许多代码库中被禁止)。它是现代编译器和编辑器出现之前的时代遗留物。然而,用用户界面组件的指示来后缀名称仍然是可以接受的(所以考虑britishGasRadioButton而不是RdoBG)。
  • 在VB.NET中启用Option Strict如果启用此选项,您将获得有关缩小操作的编译器警告和错误,这就是您尝试将Double值缩小到Int32值时所遇到的情况。
  • 你不需要检查= True的值已经是布尔值,所以If RdoEE.Checked = True可以简化为If edfEnergyRadio.Checked Then

我建议你使用Option Strict On。

这将突出显示代码中的问题:

Dim lowUnits As Integer
'...
lowUnits = 0.04

你能看到你正在尝试分配一个浮点值给Integer类型的变量吗?Visual Studio会在0.04下面放一条波浪状的红线,并给你一条消息:"选项Strict On禁止从'Double'到'Integer'的隐式转换。"

但是,当将数字作为货币处理时,使用Decimal数据类型通常是一个好主意,因为它不像Double类型那样具有表示精确十进制数的舍入误差。

关于在计算机编程中使用浮点数有一个相当全面的指南,详见What Every computer Scientist Should Know About floating-point Arithmetic。

所以,答案是声明并使用:

Dim lowUnits As Decimal
'...
lowUnits = 0.04D

其中D后缀告诉编译器0.04是小数

相关内容

  • 没有找到相关文章

最新更新