11 Nachkommastellen werden nicht richtig angezeigt...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Dksksm.

    11 Nachkommastellen werden nicht richtig angezeigt...

    Moin zusammen,

    ich wollte etwas jede Sekunde um den Wert "0.00000102777" erhöhen.
    Ich habe ein Label der folgendes anzeigt: "0.00000000000 €"

    Nun mache ich folgendes in einem Timer der auf ein Intervall von 1000 gestellt ist:

    VB.NET-Quellcode

    1. Label1.Text = Label1.Text.Replace(" €", "")
    2. Label1.Text += 0.00000102777
    3. Label1.Text = Label1.Text & " €"

    Allerdings macht er aus dem Label dann diesen Wert nach einer Sekunde "1.02777E-06 €" und nach 2 Sekunden dann den "2.05554E-06 €" usw.

    Ich würde da aber gerne nach einer Sekunde "0.00000102777 €" und nach 2 Sekunden "0.00000205554 €" usw. raus bekommen.

    Wie mach ich das am besten?

    Habe mir auch schon Double.Parse(), Convert.toDouble() usw. angeschaut. Hat nichts davon geholfen.
    Nunja du rechnest hier mit Strings. Warum? Die GUI ist nur zum Anzeigen der Daten da.

    Also bau erstmal um das du in Variablen deine Werte drin hast diese addierst und dann erst zum String Konvertierst beim Anzeigen.
    Solange wir hier mit Strings rechnen kann man da wenig machen.

    Und hier dann gleich noch ein Link um das ganze dann richtig zu Formatieren: https://docs.microsoft.com/de-de/dotnet/standard/base-types/custom-numeric-format-strings

    Und UNBEDINGT !!!! Option Strict ON siehe: Visual Studio - Empfohlene Einstellungen
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Wie xChRoNiKx schon sagte, wobei eine GUI ist nicht nur zum anzeigen von Daten da, denn dann hätten wir keine Buttons, Radiobuttons, CheckBoxen oder ähnliches. Wie hier in diesem Fall ein Label, das ist ein Control zur Anzeige von Daten.

    Wobei für's formatieren, werfe ich auch noch mal String.Format in den Raum.
    Mit 20 Nachkommastellen:

    VB.NET-Quellcode

    1. Sub NoIdea()
    2. Dim d As Double = 0D
    3. For i = 0 To 9
    4. d += 0.00000102777
    5. MessageBox.Show(String.Format("{0:N20}", d))
    6. Next
    7. End Sub

    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „NoIde“ ()

    @NoIde Danke, hat mir sehr weiter geholfen der Ansatz.
    Hab es nur ohne das For gemacht. Sieht nun so aus:

    VB.NET-Quellcode

    1. Dim money_int, money_int_add As Double
    2. ​money_int = Label1.Text.Replace(" €", "")
    3. money_int_add = 0.00000102777
    4. money_int += money_int_add
    5. Label1.Text = String.Format("{0:N11}", money_int) & " €"

    Klappt auch perfekt und wenn ich mehr oder weniger "Nachkommastellen" brauche,
    muss ich ja nur in dem "{0:N11}" die "11" ändern :D

    Danke.
    Noch ein verbesserungsvorschlag:(Achte drauf wo das €-Symbol ist ;) )

    VB.NET-Quellcode

    1. Label1.Text = String.Format("{0:N11} €", money_int)


    Auch nimmst du wieder die Zahl aus dem Text des Labels, das ist falsch. Lege den Wert der variablen fest und hohle den Wert nicht aus dem Label.Text. Das label soll nur zeigen(Text), nicht als Datenspeicher dienen.

    Solltest dir vllt. auch mal das antun:
    docs.microsoft.com/de-de/dotne…t?view=netframework-4.7.2
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin
    @PlatinSecurity Ist es ühaupt sinnvoll, einen Währungswert mit 11 Nachkommastellen anzugeben?
    Banken rechnen Zinsen und Steuern wohl mit 4 Nachkomma-Stellen.
    Angezeigt werden Währungsbeträge dann mit den "C"-Currency-Symbol:

    VB.NET-Quellcode

    1. Label1.Text = (Math.PI).ToString("C")
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    PlatinSecurity schrieb:

    money_int = Label1.Text.Replace(" €", "")


    Gut das du meinen Post komplett nicht komplett ignorierst und immer noch kein Strict On hast, und einfach das leichteste genommen hast (nämlich den Code von NoIde zu kopieren.)
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    @NoIde Danke, mach ich.

    @RodFromGermany Naja... es ist soweit sinnvoll / hilfreich, wenn man etwas mit Bitcoins berechnen will.
    Als Beispiel: 0.000000658411881 Bitcoins haben ja auch ein Wert und der wird wenn man mit 4 Nachkommastellen arbeitet, einfach 0 sein.
    Das wäre nicht anschaulich ;D
    Ich finde es auch schade, wenn so einiges ignoriert wird. Er hat zwar eine Variable angelegt für den Betrag, aber den Wert wieder aus dem Text des Labels gehohlt.
    @PlatinSecurity

    Ist doch alles ganz einfach. Variable deklarieren evtl. sofort Wert zuweisen, nur mit Variablen rechnen, nicht den Wert aus dem String hohlen(Gibt ausnahmen, aber hier kann man es anständig machen), das Label nur anzeigen lassen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    PlatinSecurity schrieb:

    Bitcoins
    erscheint in Post 8, wäre aber zur Verdeutlichung des Problems bereits in Post 1 angemessen gewesen.
    Letztendlich handelt es sich hier "nur" um eine Währungsumrechnung.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!