2017-03-19 10 views
0

小数点以下2桁を追加しています。端数部分が0.60になるたびに、切り上げる必要があります。たとえば、20.60は21.00に切り上げられます。数字の自由な丸め - すべての数字が正常に動作しない

私はこれを行うことができました。アプリケーションはほとんど動作していますが、小数点の前の数値が数百の列を超えると、999.40とし、数千の列に達したときは、仕事。たとえば、600.20と600.30という2つの数値を追加する場合は、私の答えが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 

+2

これは多くのコードであり、どこに問題があるのか​​は不明です。問題を説明するためにコードを5行以下に減らすことができたようです。どうかしていただけますか? – trincot

+0

Iveはそれを減らそうとしましたが動作しませんでした...最初の問題は、小数点 ".60456"の後に10進数値を取り除いて60番目の数字に丸めることでした。小数点が1つ増えて、私はそれを行うことができました。 – whitehand

+0

私の新しい問題は、数値が999.60を超え、結果が1000.00でなく1.00となった場合です。これらの数字を試してみてください600.30と600.20 – whitehand

答えて

1

UI要素(ラベルなど)を変数のように使用すると、コードを理解しにくくなっているようです。これは、これらのラベルの名前では助けられません。「Label44」とは何を表しているのでしょうか?

テキストボックスから入力データを取り出し、それを適切なデータ型に解析することができます。この特定のケースではDecimalを推奨します。適切な変数名を使用すると、コードが何をしているのかがわかりやすくなります。

例として、私は、フォーム上の3つのテキストボックスを置き、「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の部分に使用しないでください。問題が発生しないようにするためです。

関連する問題