我正在写一个简单的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是小数