Double Berechnung!

  • C#

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Koopakiller.

    Double Berechnung!

    Hallo,

    ich bin gerade an einem Mini-Kassenprogramm. Es gibt 2 Buttons mit 2 verschiedenen Preisen!

    Mein Code bisher:

    VB.NET-Quellcode

    1. double betrag = 0;
    2. Button1:
    3. betrag = + 5.90;
    4. label1.Text = betrag.ToString("00.00");


    Das ist zwar in Visual C# geschrieben aber das sollte das gleiche sein denke ich!

    Das Problem ist jetzt wenn ich 2 Mal auf den Button drücke dann wird nur 5.90 angezeigt. Wie kann ich es machen dass das auch wirklich + gerechnet wird also nach mehrmaligem Drücken des Buttons immernoch besteht?

    Danke im Vorraus.
    Hallo, dafür musst du die Deklaration der Variable in die Klasse auslagern:

    class Form1 : Form
    {
    double betrag = 0;
    void button1_Click(object sender, EventArgs e)
    {
    betrag = + 5.90;

    label1.Text = betrag.ToString("00.00");
    }
    //Sonstiger Code
    }

    Koopakiller schrieb:

    Hallo, dafür musst du die Deklaration der Variable in die Klasse auslagern:

    class Form1 : Form
    {
    double betrag = 0;
    void button1_Click(object sender, EventArgs e)
    {
    betrag = + 5.90;

    label1.Text = betrag.ToString("00.00");
    }
    //Sonstiger Code
    }

    Danke mein Code sieht bis jetzt so aus:

    VB.NET-Quellcode

    1. public partial class Form1 : Form
    2. {
    3. double betrag = 00.00;
    4. public Form1()
    5. {
    6. InitializeComponent();
    7. }
    8. void button2_Click(object sender, EventArgs e)
    9. {
    10. betrag = + 5.90;
    11. String checkout = betrag.ToString("00.00");
    12. betraglabel.Text = checkout;
    13. }
    14. void button3_Click(object sender, EventArgs e)
    15. {
    16. betrag = +6.90;
    17. betraglabel.Text = betrag.ToString("00.00");
    18. }
    19. }
    Hi,

    wenn du mit Geldsummen rechnest, könnte der Datentyp decimal für dich eventuell von Nutzen sein. Seine Präzision ist die höchste von allen Zahlentypen im Framework, siehe auch hier:

    MSDN schrieb:

    Compared to floating-point types, the decimal type has more precision and a smaller range, which makes it appropriate for financial and monetary calculations
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    @Lukas:
    Ich glaube nicht das er bei seinem Kassenprogramm Decimal braucht (sind ja nur 2 Nachkommastellen). Außerdem reicht Double hier völlig aus da man bei 2 Nachkommastellen keinen Fehler bei den Gleitkommazahlen fürchten muss ;)

    8-) faxe1008 8-)
    @faxe1008
    Öm, Gleitkommafehler haben nicht unbedingt was mit der Anzahl der Nachkommastellen zu tun. Es gibt im Dezimalsystem einfach manche Zahlen, die im Binärsystem nur periodisch dargestellt werden können (so wie in einem 3-Basigen System 1/3 mit 0.1 exakt dargestellt werden kann, im Dezimalsystem aber 0,3333333... heißt). Bei solchen zahlen treten also immer Rundungsfehler auf, wenn man mit Double rechnet.
    @faxe1008
    Ich glaube du verstehst mich nicht so ganz. Hier mal die Textstelle aus dem VB2008 Entwicklerbuch, der ich das entnommen habe:
    Spoiler anzeigen

    Es ist eigentlich eine ganz normale Sache, dass ein bestimmtes Zahlensystem einige Brüche nicht genau
    darstellen kann. Dennoch gibt es immer wieder Programmierer, die glauben, einen Fehler in einer Programmiersprache
    gefunden zu haben, oder behaupten, der Computer könne nicht richtig rechnen. Dabei
    kennen Sie Rundungs- bzw. Konvertierungsfehler von einem Zahlensystem in das andere aus dem täglichen
    Leben auch beim 10er-System: Wenn Sie die Zahl 1 durch 3 teilen, erhalten Sie eine Zahl mit unendlichen
    Nachkommastellen, nämlich 0,333333333333. Im Dreiersystem ein Drittel darzustellen, benötigt wesentlich
    weniger Ziffern. Es ist schlicht 0,1.
    Nun ist es ganz gleich, wie viele Ziffern Sie für die Darstellung eines für ein Zahlensystem problematischen
    Bruches verwenden; solange Sie eine endliche Anzahl von Ziffern in einem Zahlensystem verwenden, das
    einen Bruch nur periodisch darstellen kann, erhalten Sie beim Addieren dieser Zahlen Rundungsfehler.

    Das gleiche Problem hat der Computer bei bestimmten Zahlen, wenn er im Binärsystem rechnet. Während
    wir beispielsweise die Zahl 69,82 im Dezimalsystem ganz genau mit einer endlichen Anzahl von Ziffern
    darstellen können, bekommt der Computer mit dem Binärsystem Probleme:
    Die Umwandlung von 69 funktioniert noch einwandfrei, aber bei der 0,82 wird es schwierig:
    Wenn Sie wissen, dass Nachkommastellen durch negative Potenzen der Basiszahl dargestellt werden, dann
    ergibt sich folgende Rechnung:
    0.5 1*2^-1 Zwischenergebnis: 0.5
    0.25 1*2^-2 Zwischenergebnis: 0.75
    0.125 1*2^-3 Zwischenergebnis: 0.8125
    0.0625 0*2^-4 Zwischenergebnis: 0,8125
    0.03125 0*2^-5 Zwischenergebnis: 0,8125
    0,015625 0*2^-6 Zwischenergebnis: 0,8125
    0,0078125 0*2^-7 Zwischenergebnis: 0,8125
    0,00390625 1*2^-8 Zwischenergebnis: 0,81640625
    0,001953125 1*2^-9 Zwischenergebnis: 0,818359375
    0,0009765625 1*2^-10 Zwischenergebnis: 0,8193359375
    0,00048828125 1*2^-11 Zwischenergebnis: 0,81982421875
    Wir sind inzwischen bei der Zahl 0,11100001111 angelangt und haben das gewünschte Ziel immer noch
    nicht erreicht. Die Wahrheit ist: Sie können dieses Spielchen bis in alle Ewigkeit weiterspielen. Sie werden
    die Zahl 0,82 des Dezimalsystems mit einer endlichen Anzahl an Ziffern im Binärsystem niemals darstellen
    können.



    @Gonger96
    Ich wollte eigentlich auf etwas anderes hinaus (siehe oben).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

    @faxe1008: Der decimal Datentyp wurde eigens für Währungsberechnungen geschaffen. Ich denke schon, dass man ihn benutzen sollte, wo er theoretisch gebraucht würde. Ich möchte dass ein Kassenprogramm zuverlässig arbeitet, auch mit hohen Beträgen, auch wenn sie unwahrscheinlich sind. Zumal die Verwendung von decimal kein großer Umstand ist.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Ich versuche gerade wenn man auf einen Button drückt auf dem Form1 einen double und ein Label auf 0 zu setzen. Der double sowie auch das Label sind auf public gestellt!

    Hier mein Code:

    VB.NET-Quellcode

    1. this.formz = new Form1();
    2. formz.betrag = 0;
    3. formz.betraglabel.Text = "0";



    Es werden keine Fehler angezeigt!
    Dein Code ist auch vollkommen richtig, solange du es auch so machen möchtest.
    Ich denke aber, das du auf eine bestehende Instanz der Form1 zugreifen möchtest, dafür brauchst aber die entsprechende Instanz. Mit deinem Code kannst du höchstens eine neue Form erstellen.

    Koopakiller schrieb:

    Dein Code ist auch vollkommen richtig, solange du es auch so machen möchtest.
    Ich denke aber, das du auf eine bestehende Instanz der Form1 zugreifen möchtest, dafür brauchst aber die entsprechende Instanz. Mit deinem Code kannst du höchstens eine neue Form erstellen.
    Richtig. Ich möchte den Text des Labels betraglabel und den Inhalt des doubles betrag auf Form1 ändern. Was mache ich falsch?

    Danke im Vorraus.