Vb.net 摄氏到华氏转换器

Vb.net 摄氏到华氏转换器,vb.net,Vb.net,我的摄氏度到华氏度转换器在从摄氏度转换到华氏度时工作,但反过来不行 我想这可能与做两次数学有关,但我不确定 这是我的密码: Public Class frmConversion Private Sub frmConversion_Load(sender As Object, e As EventArgs) Handles MyBase.Load AcceptButton = btnConvertir End Sub Private Sub Button

我的摄氏度到华氏度转换器在从摄氏度转换到华氏度时工作,但反过来不行

我想这可能与做两次数学有关,但我不确定

这是我的密码:

Public Class frmConversion
    Private Sub frmConversion_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AcceptButton = btnConvertir
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btnConvertir.Click
        Dim intF As Decimal
        Dim intC As Decimal
        intC = Val(txtbxEntreeC.Text)
        intF = Val(txtbxEntreeF.Text)
        If Me.lblCelsius.Location.Y = 101 And Me.lblCelsius.Location.X = 39 Then
            'Crée un Integer pour Fahrenhei et Celcius
            intF = intC * 9.0 / 5.0 + 32.0
            Me.txtbxEntreeF.Text = intF
        End If
        If Me.lblCelsius.Location.X = 29 And Me.lblCelsius.Location.Y = 202 Then
            intC = (intF - 32) * 5 / 9
            Me.txtbxEntreeF.Text = intC
        End If
    End Sub

    Private Sub btnSwitch_Click(sender As Object, e As EventArgs) Handles btnSwitch.Click
        'if this is F, then we switch the c back to c and the f back to f, otherwise we do the opposite
        If Me.lblCelsius.Location.Y = 101 And Me.lblCelsius.Location.X = 39 Then
            Me.lblCelsius.Location = New Point(29, 202)
            Me.lblFahrenheit.Location = New Point(39, 101)
            txtbxEntreeC.Location = New Point(273, 98)
            txtbxEntreeF.Location = New Point(273, 199)
            txtbxEntreeC.Text = ""
            txtbxEntreeF.Text = ""
        ElseIf Me.lblCelsius.Location.X = 29 And Me.lblCelsius.Location.Y = 202 Then
            Me.lblCelsius.Location = New Point(39, 101)
            Me.lblFahrenheit.Location = New Point(29, 202)
            txtbxEntreeC.Location = New Point(273, 199)
            txtbxEntreeF.Location = New Point(273, 98)
            txtbxEntreeC.Text = ""
            txtbxEntreeF.Text = ""
        End If
    End Sub
End Class
int
是一个前缀,它使变量读起来像是integer,而它们不是;它们是十进制的。去掉匈牙利符号(在.NET中非常不推荐),注意
Val
是Microsoft.VisualBasic命名空间中的一个遗留函数,它使您的代码读起来像VB6。请改用.NET惯用类型转换和转换
Val
顺便说一句,返回一个
Double
,因此尽管从
String
显式转换为
Double
,仍然有一个隐式转换从
Double
转换为
Decimal
。选择一种类型,坚持下去

这里的隐式转换是从
十进制
字符串

有没有办法限制我文本框中小数的数量

对。使转换显式,然后

就像我使用VBA用户表单代码一样,我强烈建议为您的模型创建一个专用类,以将逻辑与数据分离。这样,您可以为每个度量单位设置一个
十进制值,将转换逻辑封装在一个位置,然后创建一个表单,该表单只负责与此“模型”交互并格式化其属性以供显示。表单的代码隐藏与实现转换逻辑本身无关——请查看模型视图演示器UI模式如何使代码更加健壮


请发布您的工作代码以获得反馈和想法(询问如何在CR上执行X或如何修复Y是离题的)。

我认为错误可能是因为数字显示的小数太多。有没有办法限制我的文本框中小数的数量?不是所有的实数都能以十进制形式准确表示,要么因为它们永远在继续(如Pi),要么因为它们永远在重复(如
1/3
)。此外,数字计算机的位数是固定的,因此即使一个特定的数字可以表示为十进制,如果它包含太多的数字,计算机也必须将其截断(即四舍五入)。因此,可以准确地说,绝大多数实数不能准确地存储在单个变量中。因此,当您以一种方式转换时,它会产生一个非整数,您不能期望它将其准确地转换回原始数字。它几乎总是会稍微偏离。简单的解决方案是在显示结果之前对结果进行四舍五入。这是一个简单的打字错误,即使用户输入华氏温度,也可以在txtbxEntreeF中显示结果。我不会移动标签和文本框。只需在“切换”按钮中更改标签的文本,然后检查label.text以确定要执行的计算。
    Dim intF As Decimal
    Dim intC As Decimal
    intC = Val(txtbxEntreeC.Text)
    intF = Val(txtbxEntreeF.Text)
Me.txtbxEntreeF.Text = intF
Me.txtbxEntreeF.Text = String.Format("{0:D2}", intF)