非常规的数字舍入 - 并非所有数字都有效

时间:2017-03-19 12:01:01

标签: vb.net

我添加了两个十进制数字。每当小数部分达到0.60时,它应该向上舍入,例如20.60向上舍入到21.00。

我已经能够做到这一点,并且应用程序大部分都在工作,但只要小数点前的数字超过数百列,就说999.40,它到达千列,千位分隔符不会#39;工作。例如,如果我想添加两个数字,比如600.20和600.30,而不是我的答案是1,200.50,我得到1.00。

到目前为止,这是我的代码:

Private Sub Calculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Calculate.Click
    'ans for txtbox5.tetx

    Try
        If Convert.ToInt32(Microsoft.VisualBasic.Right((Val(Label41.Text).ToString("N2")), 2)) + Convert.ToInt32(Microsoft.VisualBasic.Right((Val(Label42.Text).ToString("N2")), 2)) > 99 Then
            MessageBox.Show("invalid entry")
        Else
            Label41.Text = Val(TxtBox2.Text)
            Label42.Text = Val(TxtBox34.Text)

            'sum of numbers in two txtbox
            'TxtBox5.Text = Val(TxtBox2.Text) + Val(TxtBox34.Text)
            Label43.Text = (Val(Label41.Text) + Val(Label42.Text)).ToString("N2")

            'strip last 2 decimals :
            ln = Convert.ToInt32(Microsoft.VisualBasic.Right((Val(Label43.Text).ToString("N2")), 2))
            Label44.Text = ln.ToString


            'form decimal from 2 decimals
            Label45.Text = "0." & Label44.Text

            'subtract new decimal from 1st answer
            Label46.Text = (Val(Label43.Text) - Val(Label45.Text)).ToString("N2")

            'checks if striped decimal is btw 100 and 59
            If (Val(Label44.Text)) < 100 And (Val(Label44.Text)) > 59 Then
                runup = runup + 1
                newans = (Val(Label44.Text) - Val(60))
                Label45.Text = (Val(Label45.Text) - Val(0.6)).ToString("N2")

                Try
                    'check if decimal is between 100 and 59
                    If (Val(newans)) < 100 And (Val(newans)) > 59 Then
                        runup = runup + 1
                        newans = (Val(newans) - Val(60))
                        Label45.Text = (Val(Label45.Text) - Val(0.6)).ToString("N2")

                        Label47.Text = (Val(runup) + Val(Label46.Text)) + Val(Label45.Text).ToString("N2")
                        runup = 0

                        'check if new decimal is between 60 and 0
                    ElseIf (Val(newans)) < 60 And (Val(newans)) >= 0 Then
                        Label47.Text = ((Val(runup) + Val(Label46.Text)) + Val(Label45.Text)).ToString("N2")
                        runup = 0
                    End If
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try

                'check if striped decimal is btw 60 and 0
            ElseIf (Val(Label44.Text)) < 60 And (Val(Label44.Text)) >= 0 Then
                Label47.Text = ((Val(runup) + Val(Label46.Text)) + Val(Label45.Text)).ToString("N2")
                runup = 0
            End If

        End If

    Catch ex As Exception
    End Try

    TxtBox5.Text = Label47.Text

数字较大导致问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

看起来您通过使用UI元素(例如标签)使您的代码更难理解,就好像它们是变量一样。这些标签的名称没有帮助 - 你是怎么想弄清楚什么,比如“Label44”代表什么?

您可以从文本框中获取输入数据并将其解析为合适的数据类型 - 对于这种特殊情况,我建议使用Decimal - 并且使用合适的变量名称可以更容易地查看代码正在执行的操作。

例如,我在表单上放了三个文本框,并将它们命名为“tbNum1”,“tbNum2”和“tbSum”,添加了一个名为“bnCalculate”的按钮,并使用了以下代码:

Private Sub bnCalculate_Click(sender As Object, e As EventArgs) Handles bnCalculate.Click
    Dim num1 As Decimal = Decimal.Parse(tbNum1.Text)
    Dim num2 As Decimal = Decimal.Parse(tbNum2.Text)

    Dim sum = num1 + num2
    Dim frac = sum - Math.Floor(sum)

    If frac >= 0.6 Then
        sum = Math.Ceiling(sum)
    End If

    tbSum.Text = sum.ToString("N2")

End Sub

需要修改代码才能正确处理负数。

我无法辨别您的某些代码的目的是什么,例如是第一个旨在限制输入的小数位数的检查?有更简洁的方法可以做到这一点。

N.B。不要将Try...Catch与空Catch部分一起使用,因为它会隐藏您的问题。