2016-05-21 10 views
0

Hallo alle guten Nachmittag, ich habe ein Problem mit meinen Codes und es gibt mir eine harte Zeit, das zu beheben, ich hoffe jemand hilft mir dabei.Zahlen immer aufrunden vb.net

Ich habe 3 Textboxes sie sind:

GrandTotal.Text 
VatAmount.Text 
TotalAmount.Text 

und 1 NumericUpDown1, die als Prozent Identifier arbeitet. Hier

ist das Szenario meines Programms ich eine Taste drücken, wird dann eine bestimmte Spalte in meine Datagridview wird die Summe in der GrandTotal.Text (Hinweis berechnen und übertragen die Zahl wird mit Kommata Anzeige und Dezimalzahlen (Fungiert als Cent)) und dass, nachdem ich NumericUpdown1.Value drücken werde, Lets sagen, dass ich es 1 Mal und Wert von NumericUpdown1.Value drücken ist entsprechen 1 Prozent und nach dem Wert ändert zeigen die VatAmount.Text wie viel ist das 1 Prozent von Die GrandTotal.Text und TotalAmount.Text zeigen die Summe von GrandTotal.Text undan.

Hier Mein Ziel ist es, die Zahlen mit Kommata und 2 Dezimalstellen anzeigen (Acting als Cents)

Hier ist mein Code innerhalb der Textfelder, so dass Zahlen in Kommata und Dezimalstellen angezeigt werden.

Innen GrandTotal.Text

Private Sub grandtotal_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles grandtotal.TextChanged 
     Try 
      grandtotal.Text = FormatNumber(grandtotal.Text, 2, True, True, True) 
     Catch 
     End Try 
    End Sub 

Innen VatAmount.Text

Private Sub VatAmount_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VatAmount.TextChanged 
     Try 
      VatAmount.Text = FormatNumber(VatAmount.Text, 2, True, True, True) 
     Catch 
     End Try 
    End Sub 

und Innen TotalAmount.Text

Private Sub totalamount_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles totalamount.TextChanged 
     Dim dblValue As Decimal = totalamount.Text 
     totalamount.Text = dblValue.ToString("0,0.00", CultureInfo.InvariantCulture) 
End Sub 

Und hier ist der Code, der die Berechnung tun, und es ist innen NumericUpDown1.Value

Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged 

     Dim input As Double = Decimal.Parse(grandtotal.Text) 
     Dim inputStringWithCommas As Decimal = input.ToString("0,0.0", CultureInfo.InvariantCulture) 
     grandtotal.Text = inputStringWithCommas 
     Dim vat As Double = Double.Parse(grandtotal.Text) * NumericUpDown1.Value * 0.01 
     VatAmount.Text = vat.ToString() 
     totalamount.Text = Decimal.Parse(grandtotal.Text) + vat.ToString("0,0.0", CultureInfo.InvariantCulture) 
    End Sub 

Ich hoffe, Sie verstehen meine Erklärung, ich wollte es nur im Detail sein.

Hier ist meine Frage aber vorher, Lassen Sie mich Ihnen eine Beispielausgabe geben.

In meinem Rechner

1. Beispiel

150,001.50 * 1 Prozent (0,01) = 1,500.015

1,500.015 + 150,001.50 = 151,501.51

Aber in meinem Programm ist die Ausgabe wie folgt. :(

enter image description here

Jetzt sehen Sie es, Sie den Unterschied in der Ausgabe sehen kann, ist meine Frage hier Wie kann ich meinen Ausgang gleicht wie das Beispiel in meinem Rechner machen?Proper Kommata und Dezimalstellen (2 Dezimalstellen in TotalAmount.Text und NO Abrunden Cut nur 2 Dezimalstellen)

Danke für diesen Beitrag lesen und Ihnen wirklich für zukünftige Hilfe danken. Im mit VB.Net

+0

Wenn Sie '150,001.50 * 0.01' scheint die Antwort auf die gleiche Menge an Dezimalstellen gerundet werden, die Sie verwenden. Versuchen Sie alle 'Double' in' Decimal' zu ändern. Dezimal hat im Allgemeinen eine höhere Genauigkeit und soll bei der Währungsberechnung verwendet werden (es minimiert auch die Möglichkeit einer automatischen Rundung). Wenn das nicht funktioniert, benutze immer noch Dezimal, aber versuche stattdessen zu teilen: 'New Dezimal (150,001,50)/New Dezimal (1/0,01)'. –

+1

'Decimal', das zu' Double' bevorzugt wird, wurde Ihnen [gestern] (http://stackoverflow.com/questions/37343901/proper-computation-of-numbers#comment62205678_37343901) in einem doppelten upvoted Kommentar erklärt. Siehe auch [Was jeder Informatiker über Fließkomma-Arithmetik wissen sollte] (https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Plutonix

Antwort

0

Versuchen Sie dieses Stück Code Dezimalzahlen zu schneiden:

decimal d = 123.129M; 

int multiplier = Convert.ToInt32(Math.Pow(10, 2)); 
decimal newD = Math.Truncate(d * multiplier)/multiplier; 

EDIT

Sie eine Funktion ein Modul Datei in VB, mit gemeinsamen Funktionen erstellen können, etwas like:

Public Function TrimDecimals(value As Double, maxDecimals As Integer) As Double 
     Dim multiplier As Integer = Convert.ToInt32(Math.Pow(10, maxDecimals)) 
     Return Math.Truncate(value * multiplier)/multiplier 
    End Function 

    Public Function TrimDecimals(value As Decimal, maxDecimals As Integer) As Double 
     Dim multiplier As Integer = Convert.ToInt32(Math.Pow(10, maxDecimals)) 
     Return Math.Truncate(value * multiplier)/multiplier 
    End Function 

oder noch besser, können Sie Erweiterungen auf Doppel-und Dezimal für eleganter a NSATZ:

<Runtime.CompilerServices.Extension()> 
    Public Function TrimDecimals(value As Double, maxDecimals As Integer) As Double 
     Dim multiplier As Integer = Convert.ToInt32(Math.Pow(10, maxDecimals)) 
     Return Math.Truncate(value * multiplier)/multiplier 
    End Function 

    <Runtime.CompilerServices.Extension()> 
    Public Function TrimDecimals(value As Decimal, maxDecimals As Integer) As Double 
     Dim multiplier As Integer = Convert.ToInt32(Math.Pow(10, maxDecimals)) 
     Return Math.Truncate(value * multiplier)/multiplier 
    End Function 

Es gibt einige Probleme, aber bitte versuchen Sie es:

Private Sub NumericUpDown1_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NumericUpDown1.ValueChanged 
     Dim grandtotalValue As Decimal = TrimDecimals(Decimal.Parse(grandtotal.Text), 2) 
     grandtotal.Text = grandtotalValue.ToString("#,##0.00") 

     Dim vatValue As Double = TrimDecimals(grandtotalValue * NumericUpDown1.Value * 0.01, 2) 
     VatAmount.Text = vatValue.ToString("#,##0.00") 

     totalamount.Text = (grandtotalValue + vatValue).ToString("#,##0.00") 
    End Sub 
+0

Wie kann ich diesen Sir in meinen Code aufnehmen? ? :( –

+0

Ich werde diesen Code bis morgen versuchen und aktualisieren Sie direkt im Voraus. TYSM :) –

+0

Was kann ich noch sagen, so eine große Hilfe. :) TYSM –